問(wèn)題:前一段時(shí)間在項(xiàng)目中需要在項(xiàng)目初始化的時(shí)候,對(duì)一些常用數(shù)據(jù)進(jìn)行緩存,我的第一反應(yīng)是監(jiān)聽(tīng)器,所以使用了java的ServletContextListener全局異常監(jiān)聽(tīng)器,但是出現(xiàn)了一個(gè)問(wèn)題,就是項(xiàng)目使用的spring,而ServletContextListener監(jiān)聽(tīng)器是監(jiān)聽(tīng)的tomcat的啟動(dòng)過(guò)程,而不是spring容器,所以使用ServletContextListener導(dǎo)致spring中bean還未初始化成功,便執(zhí)行了監(jiān)聽(tīng)器中的緩存,導(dǎo)致空指針異常,所以今天記錄一下后面的解決辦法!
1.使用spring中的InitializingBean接口,監(jiān)聽(tīng)spring的啟動(dòng)過(guò)程,在spring裝載完所有的bean的時(shí)候,會(huì)自動(dòng)調(diào)用實(shí)現(xiàn)InitializingBean的afterPropertiesSet()方法,在里面去調(diào)用初始化用的服務(wù)或者邏輯就行。 后面再了解的時(shí)候又看到了關(guān)于InitializingBean和init-method方法在初始化bean的的一些介紹,所以這里就一并記錄下。
InitializingBean的afterPropertiesSet和init-method相同點(diǎn)是都是初始化方法使用的,但是這里問(wèn)題是他們誰(shuí)先執(zhí)行?
初始化代碼如下

init-method配置

看執(zhí)行打印結(jié)果

可以看到,先執(zhí)行InitializingBean的afterPropertiesSet方法,而后執(zhí)行init-method方法,可以從中得出幾點(diǎn)總結(jié)
1、Spring為bean提供了兩種初始化bean的方式,實(shí)現(xiàn)InitializingBean接口,實(shí)現(xiàn)afterPropertiesSet方法,或者在配置文件中通過(guò)init-method指定,兩種方式可以同時(shí)使用。
2、實(shí)現(xiàn)InitializingBean接口是直接調(diào)用afterPropertiesSet方法,比通過(guò)反射調(diào)用init-method指定的方法效率要高一點(diǎn),但是init-method方式消除了對(duì)spring的依賴(lài)。
3、如果調(diào)用afterPropertiesSet方法時(shí)出錯(cuò),則不調(diào)用init-method指定的方法。
以此記錄,見(jiàn)證自己的成長(zhǎng),方便自己查閱,不喜勿噴