1. 程式人生 > >關於Spring的Aware介面和後置處理器介面(BeanPostProcessor和BeanFactoryPostProcessor)的一些想法

關於Spring的Aware介面和後置處理器介面(BeanPostProcessor和BeanFactoryPostProcessor)的一些想法

看了關於Aware介面和後置處理器介面(BeanPostProcessor和BeanFactoryPostProcessor),感覺他們之間的功能有點亂,說一下他們之間的區別:

(1)從呼叫時間點上看,Aware介面的方法(都是setXXX方法)是在Bean的屬性被設定之後,初始化方法初始化方法(InitializingBean介面的方法,或@PostContruct等)執行之前被呼叫(這個時候Bean的整個初始化過程還沒有完成);BeanPostProcessor介面由兩個回撥方法組成,初始化方法(InitializingBean介面的方法,或@PostContruct等)執行之前呼叫BeanPostProcessor的postProcessBeforeInitialization回撥,並在初始化方法執行之後呼叫BeanPostProcessor的postProcessAfterInitialization回撥;BeanFactoryPostProcessor是在容器初始化之前被呼叫。

(2)從功能上來看,BeanPostProcessor主要是用來對例項化後的Bean做操作;BeanFactoryPostProcessor可以取得BeanFactory的引用,對例項化前的Bean定義做操作。Aware介面分的比較細,可以取得各種引用,例如:ApplicationContext,BeanFactory,MessageSource等等。在ApplicationContextAware接口裡,也可以可以通過ApplicationContext取得BeanFactory,但要注意Aware介面方法的被呼叫時間點和BeanFactoryPostProcessor不一樣。(也可以使用BeanFactoryAware介面取得BeanFactory)

(3)從實現上看,Aware介面的回撥其實是通過BeanPostProcessor介面實現的。可以看一下ApplicationContextAwareProcessor這個類,這個類繼承了BeanPostProcessor介面。這個類的處理邏輯就是,看Bean是否是幾個Aware介面的例項,如果是的話就呼叫介面提供的回撥。

 其它:看了其它的一些說明和例子,Aware介面主要是被“想要取得某種容器級的Bean”的類實現。例如,你想在你的類中釋出事件,你可以讓你的類實現ApplicationEventPublisherAware介面,好取得ApplicationEventPublisher。或者想要得到ApplicationContext的引用的話,可以實現ApplicationContextAware介面。