一扳碍、兩種后處理器

Bean后處理器:

Bean后處理器會在Bean實(shí)例創(chuàng)建成功之后,對Bean實(shí)例進(jìn)行進(jìn)一步的增強(qiáng)處理宰僧。
Bean后處理器必須實(shí)現(xiàn)BeanPOSTProcessor接口,BeanPOSTProcessor接口包含如下兩種方法:

  • Object postProcessorBeforeInitialization(Object bean,String name):該方法的第一個參數(shù)是系統(tǒng)即將進(jìn)行后臺處理的Bean實(shí)例观挎,第二個參數(shù)是改Bean的配置Id琴儿。
  • Object postProcessorAfterInitialization(Object bean,String name):該方法的第一個參數(shù)是系統(tǒng)即將進(jìn)行后臺處理的Bean實(shí)例,第二個參數(shù)是改Bean的配置Id嘁捷。

當(dāng)Spring容器實(shí)例化Bean實(shí)例之后造成,就會依次調(diào)用Bean后處理器的兩個方法對Bean實(shí)例進(jìn)行增強(qiáng)處理。

MyBeanProcessor.java

package entity;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

public class MyBeanProcessor implements BeanPostProcessor {

    
    
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName)
            throws BeansException {
        System.out.println("Bean后處理器在初始化之后對"+beanName+"進(jìn)行增強(qiáng)處理雄嚣!");
        return bean;
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName)
            throws BeansException {
        System.out.println("Bean后處理器在初始化之前對"+beanName+"進(jìn)行增強(qiáng)處理晒屎!");
        //如果該Bean是Chinese類的實(shí)例
        if(bean instanceof Chinese)
        {
            Chinese c=(Chinese)bean;
            c.setName("是的");
        }
        return bean;
    }

}

Chinese.java

package entity;

import org.springframework.beans.factory.InitializingBean;

import inter.Axe;
import inter.Persion;



public class Chinese implements Persion,InitializingBean{

    private Axe axe;
    private String name;
    public Chinese()
    {
        System.out.println("Spring實(shí)例化主調(diào)Bean:Chinese實(shí)例喘蟆。。鼓鲁。");
    }

    public void setAxe(Axe axe) {
        this.axe = axe;
    }

    public void setName(String name) {
        System.out.println("Spring為setName()方法注入依賴關(guān)系蕴轨。。骇吭。");
        this.name = name;
    }

    
    @Override
    public void useAxe() {
        // TODO Auto-generated method stub
        System.out.println(name+axe.chop());
    }

    //生命周期方法
    public void init()
    {
        System.out.println("正在執(zhí)行初始化方法init...");
    }
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("正在執(zhí)行初始化方法afterPropertiesSet");
        
    }

    
}

beans.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    
    xmlns:p="http://www.springframework.org/schema/p"
    
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
        
        
      <bean id="steelAxe" class="entity.SteelAxe"/>
      <bean id="chinese" class="entity.Chinese" init-method="init" p:axe-ref="steelAxe" p:name="依賴注入的值"/>
      
      <!-- 配置Bean后處理器橙弱,可以無需指定id屬性 -->
      <bean class="entity.MyBeanProcessor"/>
</beans>

BeanTest.java

package test;

import inter.Persion;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;





public class BeanTest {

    public static void main(String[] args) 
    {
        ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
        Persion p=ctx.getBean("chinese", Persion.class);
        p.useAxe();
    }
    
}

輸出

Bean后處理器在初始化之前對steelAxe進(jìn)行增強(qiáng)處理!
Bean后處理器在初始化之后對steelAxe進(jìn)行增強(qiáng)處理燥狰!
Spring實(shí)例化主調(diào)Bean:Chinese實(shí)例棘脐。。龙致。
Spring為setName()方法注入依賴關(guān)系蛀缝。。净当。
Bean后處理器在初始化之前對chinese進(jìn)行增強(qiáng)處理内斯!
Spring為setName()方法注入依賴關(guān)系蕴潦。像啼。。
正在執(zhí)行初始化方法afterPropertiesSet
正在執(zhí)行初始化方法init...
Bean后處理器在初始化之后對chinese進(jìn)行增強(qiáng)處理潭苞!
是的鋼斧砍柴真快忽冻!

雖然配置文件中指定chinese Bean的name為"依賴注入的值",但這并沒有放生任何作用此疹,該chinese Bean的name成員變量的值被重新設(shè)定為"是的"-----這就是Bean后處理器的作用僧诚。

實(shí)現(xiàn)BeanPostProcessor接口的Bean后處理器可對Bean進(jìn)行任何操作。

Spring提供的兩個常用后處理器:

  • BeanNameAutoProxyCreator:根據(jù)Bean實(shí)例的name屬性蝗碎,創(chuàng)建Bean實(shí)例的代理湖笨。
  • DefaultAdvisorAutoProxyCreator:根據(jù)提供的Advisor對容器中的所有Bean實(shí)例創(chuàng)建代理。

容器后處理器:

Bean后處理器負(fù)責(zé)處理容器中所有的Bean實(shí)例蹦骑,容器后處理器負(fù)責(zé)處理容器本身慈省。
容器后處理器必須實(shí)現(xiàn)BeanFactoryPostProcessor接口,必須實(shí)現(xiàn)如下一個方法:

  • postProcessorBeanFactory(ConfigurableListableBeanFactory beanFactory)

ApplicationContext可自動檢測容器中的容器后處理器眠菇,并且自動注冊容器后處理器边败。但若使用BeanFactory作為容器后處理器,則必須手動調(diào)用該容器后處理器來處理BeanFactory容器捎废。

MyBeanFactoryPostProcessor.java

package entity;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;

public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
            throws BeansException {
        System.out.println("程序?qū)pring所做的BeanFactory的初始化沒有改變...");
        System.out.println("Spring容器是:"+beanFactory);
        
    }

}

beans.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    
    xmlns:p="http://www.springframework.org/schema/p"
    
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
        
        
      <bean id="steelAxe" class="entity.SteelAxe"/>
      <bean id="chinese" class="entity.Chinese" init-method="init" p:axe-ref="steelAxe" p:name="依賴注入的值"/>
      
      <!-- 配置Bean后處理器笑窜,可以無需指定id屬性 -->
      <bean class="entity.MyBeanProcessor"/>
      
      <!-- 配置容器后處理器 -->
      <bean class="entity.MyBeanFactoryPostProcessor"/>
</beans>

BeanTest.java

package test;

import inter.Persion;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;





public class BeanTest {

    public static void main(String[] args) 
    {
        ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
        Persion p=ctx.getBean("chinese", Persion.class);
        p.useAxe();
    }
    
}

輸出

程序?qū)pring所做的BeanFactory的初始化沒有改變...
Spring容器是:org.springframework.beans.factory.support.DefaultListableBeanFactory@29482a89: defining beans [steelAxe,chinese,entity.MyBeanProcessor#0,entity.MyBeanFactoryPostProcessor#0]; root of factory hierarchy
Bean后處理器在初始化之前對steelAxe進(jìn)行增強(qiáng)處理!
Bean后處理器在初始化之后對steelAxe進(jìn)行增強(qiáng)處理登疗!
Spring實(shí)例化主調(diào)Bean:Chinese實(shí)例排截。。。
Spring為setName()方法注入依賴關(guān)系匾寝。搬葬。。
Bean后處理器在初始化之前對chinese進(jìn)行增強(qiáng)處理艳悔!
Spring為setName()方法注入依賴關(guān)系急凰。。猜年。
正在執(zhí)行初始化方法afterPropertiesSet
正在執(zhí)行初始化方法init...
Bean后處理器在初始化之后對chinese進(jìn)行增強(qiáng)處理抡锈!
是的鋼斧砍柴真快!

Spring提供如下幾個常用的容器后處理器:

  • PropertyPlaceholderConfigurer:屬性占位符配置器乔外。
  • PropertyOverrideConfigurer:重寫占位符配置器床三。
  • CustomAutowireConfigurer:自定義自動裝配配置器。
  • CustomScopeConfigurer:自定義作用域的配置器杨幼。

Spring沒有提供ApplicationContextPostProcessor撇簿,對于ApplicationContext容器,一樣使用BeanFactoryPostProcessor作為容器后處理器差购。容器后處理器的作用域范圍是容器級四瘫,它只對容器本身進(jìn)行處理,而不對容器中的Bean進(jìn)行處理欲逃。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末找蜜,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子稳析,更是在濱河造成了極大的恐慌洗做,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件彰居,死亡現(xiàn)場離奇詭異诚纸,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)陈惰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門畦徘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人奴潘,你說我怎么就攤上這事旧烧。” “怎么了画髓?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵掘剪,是天一觀的道長。 經(jīng)常有香客問我奈虾,道長夺谁,這世上最難降的妖魔是什么廉赔? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮匾鸥,結(jié)果婚禮上蜡塌,老公的妹妹穿的比我還像新娘。我一直安慰自己勿负,他們只是感情好馏艾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著奴愉,像睡著了一般琅摩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上锭硼,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天房资,我揣著相機(jī)與錄音,去河邊找鬼檀头。 笑死轰异,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的暑始。 我是一名探鬼主播搭独,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蒋荚!你這毒婦竟也來了戳稽?” 一聲冷哼從身側(cè)響起馆蠕,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤期升,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后互躬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體播赁,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年吼渡,在試婚紗的時候發(fā)現(xiàn)自己被綠了容为。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡寺酪,死狀恐怖坎背,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情寄雀,我是刑警寧澤得滤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站盒犹,受9級特大地震影響懂更,放射性物質(zhì)發(fā)生泄漏眨业。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一沮协、第九天 我趴在偏房一處隱蔽的房頂上張望龄捡。 院中可真熱鬧,春花似錦慷暂、人聲如沸聘殖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽就斤。三九已至,卻和暖如春蘑辑,著一層夾襖步出監(jiān)牢的瞬間洋机,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工洋魂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绷旗,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓副砍,卻偏偏與公主長得像衔肢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子豁翎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容