日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring中BeanPostProcessor

發(fā)布時(shí)間:2024/9/20 javascript 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring中BeanPostProcessor 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Spring提供了很多擴(kuò)展接口,BeanPostProcessor接口和InstantiationAwareBeanPostProcessor接口就是其中兩個(gè)。

BeanPostProcessor

BeanPostProcessor接口作用是:如果我們需要在Spring容器完成Bean的實(shí)例化、配置和其他的初始化前后添加一些自己的邏輯處理,我們就可以定義一個(gè)或者多個(gè)BeanPostProcessor接口的實(shí)現(xiàn),然后注冊到容器中。

Spring中Bean的實(shí)例化過程圖示:

由上圖可以看到,Spring中的BeanPostProcessor在實(shí)例化過程處于的位置,BeanPostProcessor接口有兩個(gè)方法需要實(shí)現(xiàn):postProcessBeforeInitialization和postProcessAfterInitialization,

Java代碼??
  • import?org.springframework.beans.factory.config.BeanPostProcessor;??
  • ???
  • public?class?MyBeanPostProcessor?implements?BeanPostProcessor?{??
  • ???
  • ?????public?MyBeanPostProcessor()?{??
  • ????????super();??
  • ????????System.out.println("這是BeanPostProcessor實(shí)現(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?{??
  • ??
  • ????/**?
  • ?????*?Apply?this?BeanPostProcessor?to?the?given?new?bean?instance?<i>before</i>?any?bean?
  • ?????*?initialization?callbacks?(like?InitializingBean's?{@code?afterPropertiesSet}?
  • ?????*?or?a?custom?init-method).?The?bean?will?already?be?populated?with?property?values.????
  • ?????*/??
  • //實(shí)例化、依賴注入完畢,在調(diào)用顯示的初始化之前完成一些定制的初始化任務(wù)??
  • ????Object?postProcessBeforeInitialization(Object?bean,?String?beanName)?throws?BeansException;??
  • ??
  • ??????
  • ????/**?
  • ?????*?Apply?this?BeanPostProcessor?to?the?given?new?bean?instance?<i>after</i>?any?bean?
  • ?????*?initialization?callbacks?(like?InitializingBean's?{@code?afterPropertiesSet}???
  • ?????*?or?a?custom?init-method).?The?bean?will?already?be?populated?with?property?values.???????
  • ?????*/??
  • //實(shí)例化、依賴注入、初始化完畢時(shí)執(zhí)行??
  • ????Object?postProcessAfterInitialization(Object?bean,?String?beanName)?throws?BeansException;??
  • ??
  • }??
  • 由方法名字也可以看出,前者在實(shí)例化及依賴注入完成后、在任何初始化代碼(比如配置文件中的init-method)調(diào)用之前調(diào)用;后者在初始化代碼調(diào)用之后調(diào)用。

    注意:

    1、接口中的兩個(gè)方法都要將傳入的bean返回,而不能返回null,如果返回的是null那么我們通過getBean方法將得不到目標(biāo)。

    2、BeanFactory和ApplicationContext對待bean后置處理器稍有不同。ApplicationContext會(huì)自動(dòng)檢測在配置文件中實(shí)現(xiàn)了BeanPostProcessor接口的所有bean,并把它們注冊為后置處理器,然后在容器創(chuàng)建bean的適當(dāng)時(shí)候調(diào)用它,因此部署一個(gè)后置處理器同部署其他的bean并沒有什么區(qū)別。而使用BeanFactory實(shí)現(xiàn)的時(shí)候,bean 后置處理器必須通過代碼顯式地去注冊,在IoC容器繼承體系中的ConfigurableBeanFactory接口中定義了注冊方法:

    Java代碼??
  • /**??
  • ?*?Add?a?new?BeanPostProcessor?that?will?get?applied?to?beans?created??
  • ?*?by?this?factory.?To?be?invoked?during?factory?configuration.??
  • ?*?<p>Note:?Post-processors?submitted?here?will?be?applied?in?the?order?of??
  • ?*?registration;?any?ordering?semantics?expressed?through?implementing?the??
  • ?*?{@link?org.springframework.core.Ordered}?interface?will?be?ignored.?Note??
  • ?*?that?autodetected?post-processors?(e.g.?as?beans?in?an?ApplicationContext)??
  • ?*?will?always?be?applied?after?programmatically?registered?ones.??
  • ?*?@param?beanPostProcessor?the?post-processor?to?register??
  • ?*/????
  • void?addBeanPostProcessor(BeanPostProcessor?beanPostProcessor);???
  • 另外,不要將BeanPostProcessor標(biāo)記為延遲初始化。因?yàn)槿绻@樣做,Spring容器將不會(huì)注冊它們,自定義邏輯也就無法得到應(yīng)用。假如你在<beans />元素的定義中使用了'default-lazy-init'屬性,請確信你的各個(gè)BeanPostProcessor標(biāo)記為'lazy-init="false"'。

    InstantiationAwareBeanPostProcessor

    InstantiationAwareBeanPostProcessor是BeanPostProcessor的子接口,可以在Bean生命周期的另外兩個(gè)時(shí)期提供擴(kuò)展的回調(diào)接口,即實(shí)例化Bean之前(調(diào)用postProcessBeforeInstantiation方法)和實(shí)例化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接口類似,只時(shí)回調(diào)時(shí)機(jī)不同。 如果是使用ApplicationContext來生成并管理Bean的話則稍有不同,使用ApplicationContext來生成及管理Bean實(shí)例的話,在執(zhí)行BeanFactoryAware的setBeanFactory()階段后,若Bean類上有實(shí)現(xiàn)org.springframework.context.ApplicationContextAware接口,則執(zhí)行其setApplicationContext()方法,接著才執(zhí)行BeanPostProcessors的ProcessBeforeInitialization()及之后的流程。

    總結(jié)

    以上是生活随笔為你收集整理的Spring中BeanPostProcessor的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。