Spring應用--實現InitializingBean介面
有時候會遇到這樣的問題:
在我們將一個Bean交給Spring管理的時候,有時候我們的Bean中有某個屬性需要注入,但是又不能通過一般的方式注入,什麼意思呢?舉個栗子:首先我們有個Service,在該Service中有一個屬性,但是該屬性不支援Spring注入,只能通過Build或者new的方式建立(比如StringBuffer之類的),但是我們想在Spring配置Bean的時候一起將該屬性注入進來,這時候該怎麼辦呢?這時候可以通過實現InitializingBean介面來解決!
@Service public class DemoService implements InitializingBean{ private StringBuffer stringBuffer; @Override public void afterPropertiesSet() throws Exception { stringBuffer = new StringBuffer(); } }
上面的列子實現了InitializingBean介面並實現其afterPropertiesSet方法,通過這種方式就可以實現一些比較特殊的注入,當然也可以在afterPropertiesSet方法中新增一些其他邏輯來控制建立的物件。當然除了InitializingBean介面,還有一個類似的介面:DisposableBean ,該介面的作用是在物件銷燬時呼叫。
原理:
首先說說spring的IOC容器初始化過程,首先Spring會定位BeanDefinition資原始檔,然後會一個一個的去載入所有BeanDefinition,這裡的BeanDefinition就是指的Bean的資原始檔,即:在XML中配置的Bean和通過註解裝配的Bean,在載入完所有BeanDefinition之後,會將這些BeanDefinition註冊到一個HashMap中。到此spring的IOC初始化完成,那麼依賴注入發生在哪裡呢?在使用者第一次向IOC容器索要Bean時才開始依賴注入過程(也可以通過配置lazy-init屬性讓容器初始化的時候就對Bean預例項化)那究竟afterPropertiesSet()方法的呼叫是在哪個時間點呢?通過檢視該方法上的註釋:
Invoked by a BeanFactory after it has set all bean properties supplied (and satisfied BeanFactoryAware and ApplicationContextAware).
可以看到在Bean所有的屬性都被注入之後會去呼叫這個afterPropertiesSet()方法,其實在依賴注入完成的時候,spring會去檢查這個類是否實現了InitializingBean介面,如果實現了InitializingBean介面,就會去呼叫這個類的afterPropertiesSet()方法。所以afterPropertiesSet()方法的執行時間點就很清楚了,發生在所有的properties被注入後。
作者:落葉刻痕
連結:https://www.jianshu.com/p/cbfed4b6541f
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。