介紹
ApplicationListener和ContextRefreshedEvent一般都是成對出現(xiàn)的
org.springframework.context.support.AbstractApplicationContext
在IOC的容器的啟動過程院崇,當所有的bean都已經(jīng)處理完成之后庙睡,spring ioc容器會有一個發(fā)布事件的動作湃缎。從 AbstractApplicationContext 的源碼中就可以看出
當ioc容器加載處理完相應(yīng)的bean之后懦冰,也給我們提供了一個機會(先有InitializingBean浪慌,后有ApplicationListener<ContextRefreshedEvent>)趁桃,可以去做一些自己想做的事。其實這也就是spring ioc容器給提供的一個擴展的地方扔役。我們可以這樣使用這個擴展機制帆喇。
org.springframework.context.ApplicationEvent
org.springframework.context.ApplicationListener
一個最簡單的方式就是,讓我們的bean實現(xiàn)ApplicationListener接口亿胸,這樣當發(fā)布事件時坯钦,[spring]的ioc容器就會以容器的實例對象作為事件源類预皇,并從中找到事件的監(jiān)聽者,此時ApplicationListener接口實例中的onApplicationEvent(E event)方法就會被調(diào)用婉刀,我們的邏輯代碼就會寫在此處吟温。這樣我們的目的就達到了
示例
系統(tǒng)會存在兩個容器,一個是root application context ,另一個就是我們自己的 projectName-servlet context(作為root application context的子容器)
這種情況下突颊,就會造成onApplicationEvent方法被執(zhí)行兩次鲁豪。為了避免上面提到的問題,我們可以只在root application context初始化完成后調(diào)用邏輯代碼律秃,其他的容器的初始化完成爬橡,則不做任何處理
if (event.getApplicationContext().getParent() == null) { //root application context 沒有parent
//其它邏輯
logger.info("register computer to zookeeper");
// Zookeeper注冊本機
ZookeeperClient zkclient = ZookeeperClient.create();
zkclient.registerComputer();
}