Spring Bean生命周期-prepareBeanFactory(五)

在ApplicationContext刷新獲取beanFactory之后法希,開始準(zhǔn)備context使用的beanFactory昌妹。這一步相對比較簡單议忽,就是配置facotry的特性恃鞋,比如:ClassLoader躲撰,post-processors等等

代碼如下:

protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
        // Tell the internal bean factory to use the context's class loader etc.
        //讓BeanFactory使用context的class loader
        beanFactory.setBeanClassLoader(getClassLoader());
        beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
        beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));

        // Configure the bean factory with context callbacks.
        // 配置bean factory的context回調(diào)
        beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
        beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
        beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
        beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
        beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
        beanFactory.ignoreDependencyInterface(EnvironmentAware.class);

        // BeanFactory interface not registered as resolvable type in a plain factory.
        // MessageSource registered (and found for autowiring) as a bean.
        beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
        beanFactory.registerResolvableDependency(ResourceLoader.class, this);
        beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
        beanFactory.registerResolvableDependency(ApplicationContext.class, this);

        // Detect a LoadTimeWeaver and prepare for weaving, if found.
        if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
            beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
            // Set a temporary ClassLoader for type matching.
            beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
        }

        // Register default environment beans.
        // 注冊默認的environment bean
        if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
            beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
        }
        if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
            beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
        }
        if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
            beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
        }
    }

分析

beanfactory的準(zhǔn)備階段精偿,比較簡單弧圆,主要明白準(zhǔn)備階段操作的幾個方法。

beanFactory.addBeanPostProcessor

添加BeanPostProcessor笔咽,當(dāng)bean被這個工廠創(chuàng)建的時候會用到PostProcessor, 在beanfactory中存儲了beanPostProcessors的列表搔预,在生效的時候,列表中的PostProcessor都會執(zhí)行叶组。

        beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
beanFactory.ignoreDependencyInterface(Class<?> ifc)

在注入的時候忽略此方法指定的接口類拯田。也就是指定的接口不會被注入進去。

如下甩十,不會生效

@Autowire 
ResourceLoaderAware aware;
        beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
        beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
        beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
        beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
        beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
beanFactory.registerResolvableDependency(Class<?> dependencyType, Object autowiredValue)

注冊可以解析的依賴關(guān)系船庇,當(dāng)注入的類型為dependencyType的時候,注入autowiredValue侣监。
注入類型與注入值的關(guān)系存儲在map中鸭轮。

resolvableDependencies = new ConcurrentHashMap<Class<?>, Object>(16);

// 注入類型為BeanFactory時,注入beanFactory(DefaultListableBeanFactory)
beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
        beanFactory.registerResolvableDependency(ResourceLoader.class, this);

//注入類型為ApplicationEventPublisher時橄霉,注入值為this(ApplicationContext)
beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);

//注入類型為ApplicationContext時窃爷,注入值也為this(ApplicationContext)
beanFactory.registerResolvableDependency(ApplicationContext.class, this);

額外

prepareBeanFactory主要做一些準(zhǔn)備工作,沒有什么邏輯,在Applicationcontext的refresh方法中往下看一步按厘,執(zhí)行

postProcessBeanFactory(beanFactory);

這一步Spring框架中沒有實現(xiàn)医吊,留待我們自己實現(xiàn)。

最后

這次看了refresh方法中的prepareBeanFactory內(nèi)容比較簡單逮京,就不多說了卿堂。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市懒棉,隨后出現(xiàn)的幾起案子草描,更是在濱河造成了極大的恐慌,老刑警劉巖漓藕,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件陶珠,死亡現(xiàn)場離奇詭異,居然都是意外死亡享钞,警方通過查閱死者的電腦和手機揍诽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來栗竖,“玉大人暑脆,你說我怎么就攤上這事『” “怎么了添吗?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長份名。 經(jīng)常有香客問我碟联,道長,這世上最難降的妖魔是什么僵腺? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任鲤孵,我火速辦了婚禮,結(jié)果婚禮上辰如,老公的妹妹穿的比我還像新娘普监。我一直安慰自己,他們只是感情好琉兜,可當(dāng)我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布凯正。 她就那樣靜靜地躺著,像睡著了一般豌蟋。 火紅的嫁衣襯著肌膚如雪廊散。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天梧疲,我揣著相機與錄音奸汇,去河邊找鬼施符。 笑死,一個胖子當(dāng)著我的面吹牛擂找,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播浩销,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼贯涎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了慢洋?” 一聲冷哼從身側(cè)響起塘雳,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎普筹,沒想到半個月后败明,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡太防,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年妻顶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜒车。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡讳嘱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出酿愧,到底是詐尸還是另有隱情沥潭,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布嬉挡,位于F島的核電站钝鸽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏庞钢。R本人自食惡果不足惜拔恰,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望焊夸。 院中可真熱鬧仁连,春花似錦、人聲如沸阱穗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽揪阶。三九已至昌抠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鲁僚,已是汗流浹背炊苫。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工裁厅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人侨艾。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓执虹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親唠梨。 傳聞我的和親對象是個殘疾皇子袋励,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,689評論 2 354

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