生活随笔
收集整理的這篇文章主要介紹了
Spring中BeanPostProcessor
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Spring提供了很多擴(kuò)展接口,BeanPostProcessor接口和InstantiationAwareBeanPostProcessor接口就是其中兩個。
BeanPostProcessor
BeanPostProcessor接口作用是:如果我們需要在Spring容器完成Bean的實例化、配置和其他的初始化前后添加一些自己的邏輯處理,我們就可以定義一個或者多個BeanPostProcessor接口的實現(xiàn),然后注冊到容器中。
Spring中Bean的實例化過程圖示:
由上圖可以看到,Spring中的BeanPostProcessor在實例化過程處于的位置,BeanPostProcessor接口有兩個方法需要實現(xiàn):postProcessBeforeInitialization和postProcessAfterInitialization,
Java代碼??
import?org.springframework.beans.factory.config.BeanPostProcessor;?????public?class?MyBeanPostProcessor?implements?BeanPostProcessor?{??????????public?MyBeanPostProcessor()?{??????????super();??????????System.out.println("這是BeanPostProcessor實現(xiàn)類構(gòu)造器!!");???????????????}??????????@Override???????public?Object?postProcessAfterInitialization(Object?bean,?String?arg1)???????????????throws?BeansException?{???????????System.out.println("bean處理器:bean創(chuàng)建之后..");???????????return?bean;???????}??????????@Override???????public?Object?postProcessBeforeInitialization(Object?bean,?String?arg1)???????????????throws?BeansException?{???????????System.out.println("bean處理器:bean創(chuàng)建之前..");??????????????????return?bean;???????}???}?? BeanPostProcessor接口定義如下:
Java代碼??
public?interface?BeanPostProcessor?{????????????Object?postProcessBeforeInitialization(Object?bean,?String?beanName)?throws?BeansException;??????????????????Object?postProcessAfterInitialization(Object?bean,?String?beanName)?throws?BeansException;????}?? 由方法名字也可以看出,前者在實例化及依賴注入完成后、在任何初始化代碼(比如配置文件中的init-method)調(diào)用之前調(diào)用;后者在初始化代碼調(diào)用之后調(diào)用。
注意:
1、接口中的兩個方法都要將傳入的bean返回,而不能返回null,如果返回的是null那么我們通過getBean方法將得不到目標(biāo)。
2、BeanFactory和ApplicationContext對待bean后置處理器稍有不同。ApplicationContext會自動檢測在配置文件中實現(xiàn)了BeanPostProcessor接口的所有bean,并把它們注冊為后置處理器,然后在容器創(chuàng)建bean的適當(dāng)時候調(diào)用它,因此部署一個后置處理器同部署其他的bean并沒有什么區(qū)別。而使用BeanFactory實現(xiàn)的時候,bean 后置處理器必須通過代碼顯式地去注冊,在IoC容器繼承體系中的ConfigurableBeanFactory接口中定義了注冊方法:
Java代碼??
void?addBeanPostProcessor(BeanPostProcessor?beanPostProcessor);??? 另外,不要將BeanPostProcessor標(biāo)記為延遲初始化。因為如果這樣做,Spring容器將不會注冊它們,自定義邏輯也就無法得到應(yīng)用。假如你在<beans />元素的定義中使用了'default-lazy-init'屬性,請確信你的各個BeanPostProcessor標(biāo)記為'lazy-init="false"'。
InstantiationAwareBeanPostProcessor
InstantiationAwareBeanPostProcessor是BeanPostProcessor的子接口,可以在Bean生命周期的另外兩個時期提供擴(kuò)展的回調(diào)接口,即實例化Bean之前(調(diào)用postProcessBeforeInstantiation方法)和實例化Bean之后(調(diào)用postProcessAfterInstantiation方法),該接口定義如下: Java代碼??
package?org.springframework.beans.factory.config;????????import?java.beans.PropertyDescriptor;????????import?org.springframework.beans.BeansException;????import?org.springframework.beans.PropertyValues;????????public?interface?InstantiationAwareBeanPostProcessor?extends?BeanPostProcessor?{????????????Object?postProcessBeforeInstantiation(Class<?>?beanClass,?String?beanName)?throws?BeansException;????????????boolean?postProcessAfterInstantiation(Object?bean,?String?beanName)?throws?BeansException;????????????PropertyValues?postProcessPropertyValues(????????????????PropertyValues?pvs,?PropertyDescriptor[]?pds,?Object?bean,?String?beanName)????????????????throws?BeansException;????????}?? ?其使用方法與上面介紹的BeanPostProcessor接口類似,只時回調(diào)時機(jī)不同。 如果是使用ApplicationContext來生成并管理Bean的話則稍有不同,使用ApplicationContext來生成及管理Bean實例的話,在執(zhí)行BeanFactoryAware的setBeanFactory()階段后,若Bean類上有實現(xiàn)org.springframework.context.ApplicationContextAware接口,則執(zhí)行其setApplicationContext()方法,接著才執(zhí)行BeanPostProcessors的ProcessBeforeInitialization()及之后的流程。
總結(jié)
以上是生活随笔為你收集整理的Spring中BeanPostProcessor的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。