javascript
Spring Bean的生命周期及接口回调
本篇介紹Spring框架為Spring Bean生命周期各階段提供的回調(diào)接口,程序通過實現(xiàn)回調(diào)接口,可以在IOC容器實例化或銷毀Bean的過程中,得到Bean的控制權(quán),并對Bean進(jìn)行預(yù)處理工作。通過本篇的學(xué)習(xí),可以達(dá)成如下目標(biāo)。
● 了解Spring Bean的生命周期
● 掌握和運用Spring Bean生命周期各階段提供的接口
● 能夠?qū)pring Bean做預(yù)處理工作
Spring Bean雖然由IOC容器管理,不需要程序過多干預(yù)。但在一些情況下,程序可能需要在容器之外,對Bean進(jìn)行一些處理工作。如IOC容器實例化Bean時,程序?qū)ean進(jìn)行一些初始化工作,或者IOC容器銷毀Bean時,程序?qū)ean做一些數(shù)據(jù)的保存或清除工作。
Spring Bean從創(chuàng)建、運行到銷毀經(jīng)歷了若干階段,在Bean生命周期的每個階段,程序都可以通過初始化回調(diào)、在配置文件中聲明方法、前置或后置處理等技術(shù)獲取Bean的控制權(quán),對Bean進(jìn)行處理工作。Bean生命周期的各個階段如下圖所示。
回調(diào)Aware接口
當(dāng)Spring IOC容器內(nèi)的Bean對象實例化完成并且相關(guān)屬性以及依賴設(shè)置完成后,IOC容器會檢查當(dāng)前Bean對象是否實現(xiàn)Aware接口,如果實現(xiàn)了Aware接口,則調(diào)用Bean已經(jīng)實現(xiàn)的Aware接口。Bean通過實現(xiàn)這些接口,可以增強Bean的功能,但是也增加了對Spring容器的依賴。
表 1 可以實現(xiàn)的Aware接口列表
?
例1:實現(xiàn)BeanNameAware接口
修改課程案例Teacher類,實現(xiàn)BeanNameAware接口。
setBeanName為實現(xiàn)的接口,接口簡單輸出bean的名稱。運行結(jié)果如下圖所示。
從輸出結(jié)果可以看出,Teacher類實現(xiàn)了BeanNameAware接口后,IOC容器將回調(diào)Bean實現(xiàn)的BeanNameAware接口的setBeanName方法。
前置處理和后置處理器BeanPostProcessor
前置處理是指程序在Spring IOC容器初始化Bean之前、屬性設(shè)置之后對該Bean先做一些預(yù)處理工作。Spring提供了BeanPostProcessors接口,Bean通過實現(xiàn)該接口的postProcessBeforeInitialization和postProcessAfterInitialization方法,可以在Bean初始化之前或初始化之后做前置處理和后置處理操作。
例2:實現(xiàn)BeanPostProcessor的前置和后置接口
修改課程案例Teacher類,實現(xiàn)postProcessBeforeInitialization前置接口和postProcessAfterInitialization后置接口。
?
建立beanpost.xml配置文件
建立BeanPostTest類文件。
?
執(zhí)行BeanPostTest類文件,輸出結(jié)果如下圖所示。
回調(diào)InitializingBean接口
InitializingBean接口為Bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是繼承該接口的類,在初始化Bean的時候會執(zhí)行該方法。
例3:實現(xiàn)InitializingBean接口
修改課程案例Teacher類,實現(xiàn)InitializingBean接口的afterPropertiesSet方法。
配置init-method方法
在Spring配置文件中,可以使用 init-method 屬性來指定帶有 void 無參數(shù)方法的名稱,該方法在Bean實例完成創(chuàng)建后調(diào)用。
例4:實現(xiàn)init-method方法
修改beanpost.xml配置文件,在配置文件中添加init-method屬性。
修改Teacher類,添加init方法。
執(zhí)行BeanPostTest文件,輸出結(jié)果如下圖所示。
從上圖可以看出,實現(xiàn)InitializingBean接口的afterPropertiesSet方法首先被調(diào)用,然后init方法被調(diào)用。
回調(diào)DisposableBean接口
DisposableBean接口為釋放Bean提供了釋放資源的方法,它只包括destory方法,凡是繼承該接口的類,在釋放Bean的時候會執(zhí)行該方法。
例5:實現(xiàn)DisposableBean接口
修改課程案例Teacher類,實現(xiàn)DisposableBean接口的destroy方法。
?
配置destroy-method方法
在Spring配置文件中,可以使用 destroy-method 屬性來指定帶有 void 無參數(shù)方法的名稱,該方法在Bean實例銷毀后調(diào)用。
例5:實現(xiàn)destroy-method方法
修改beanpost.xml配置文件,在配置文件中添加destroy-method屬性。
修改Teacher類,添加destroy_mehtod方法。
?
課程小結(jié)
IOC容器創(chuàng)建Bean并設(shè)置Bean屬性后,將執(zhí)行以下操作:(1)檢查Aware接口,如果Bean實現(xiàn)了Aware接口,則執(zhí)行回調(diào);(2)檢查和回調(diào)BeanPostProcessor的前置處理接口;(3)執(zhí)行Bean的初始化工作,并調(diào)用InitializingBean接口,如果在配置文件中Bean定義了init-method屬性,則同時調(diào)用init-method屬性指定的方法;(4)Bean初始化完成后,IOC容器會調(diào)用BeanPostProcessor的后置處理接口;(5)Bean進(jìn)入運行階段;(6)Bean被銷毀時調(diào)用DisposableBean接口,如果在配置文件中Bean定義了destroy_mehtod屬性,則同時調(diào)用destroy_mehtod屬性指定的方法。
總結(jié)
以上是生活随笔為你收集整理的Spring Bean的生命周期及接口回调的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Java】浅析Java位移运算符<<、
- 下一篇: 【Python】Matplotlib绘制