spring中的refresh()

AbstractApplicationContext的refresh()方法是spring的核心谦炬,在其中完成了容器的初始化

public void refresh() throws BeansException, IllegalStateException {
        synchronized (this.startupShutdownMonitor) {
            // Prepare this context for refreshing.
            prepareRefresh();

            // Tell the subclass to refresh the internal bean factory.
            ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

            // Prepare the bean factory for use in this context.
            prepareBeanFactory(beanFactory);

            try {
                // Allows post-processing of the bean factory in context subclasses.
                postProcessBeanFactory(beanFactory);

                // Invoke factory processors registered as beans in the context.
                invokeBeanFactoryPostProcessors(beanFactory);

                // Register bean processors that intercept bean creation.
                registerBeanPostProcessors(beanFactory);

                // Initialize message source for this context.
                initMessageSource();

                // Initialize event multicaster for this context.
                initApplicationEventMulticaster();

                // Initialize other special beans in specific context subclasses.
                onRefresh();

                // Check for listener beans and register them.
                registerListeners();

                // Instantiate all remaining (non-lazy-init) singletons.
                finishBeanFactoryInitialization(beanFactory);

                // Last step: publish corresponding event.
                finishRefresh();
            }

            catch (BeansException ex) {
                if (logger.isWarnEnabled()) {
                    logger.warn("Exception encountered during context initialization - " +
                            "cancelling refresh attempt: " + ex);
                }

                // Destroy already created singletons to avoid dangling resources.
                destroyBeans();

                // Reset 'active' flag.
                cancelRefresh(ex);

                // Propagate exception to caller.
                throw ex;
            }

            finally {
                // Reset common introspection caches in Spring's core, since we
                // might not ever need metadata for singleton beans anymore...
                resetCommonCaches();
            }
        }
    }

1、prepareRefresh();

容器刷新前的準(zhǔn)備,設(shè)置上下文狀態(tài)驳庭,獲取屬性兼丰,驗(yàn)證必要的屬性等

2、obtainFreshBeanFactory();

獲取新的beanFactory笆载,銷毀原有beanFactory扑馁、為每個(gè)bean生成BeanDefinition

3、prepareBeanFactory(beanFactory);

配置標(biāo)準(zhǔn)的beanFactory宰译,設(shè)置ClassLoader檐蚜,設(shè)置SpEL表達(dá)式解析器,添加忽略注入的接口沿侈,添加bean闯第,添加bean后置處理器等

4、postProcessBeanFactory(beanFactory);

模板方法缀拭,此時(shí)咳短,所有的beanDefinition已經(jīng)加載填帽,但是還沒(méi)有實(shí)例化。
允許在子類中對(duì)beanFactory進(jìn)行擴(kuò)展處理咙好。比如添加ware相關(guān)接口自動(dòng)裝配設(shè)置篡腌,添加后置處理器等,是子類擴(kuò)展prepareBeanFactory(beanFactory)的方法

5勾效、invokeBeanFactoryPostProcessors(beanFactory);

實(shí)例化并調(diào)用所有注冊(cè)的beanFactory后置處理器(實(shí)現(xiàn)接口BeanFactoryPostProcessor的bean嘹悼,在beanFactory標(biāo)準(zhǔn)初始化之后執(zhí)行)。
例如:
PropertyPlaceholderConfigurer(處理占位符)

6层宫、registerBeanPostProcessors(beanFactory);

實(shí)例化和注冊(cè)beanFactory中擴(kuò)展了BeanPostProcessor的bean杨伙。
例如:
AutowiredAnnotationBeanPostProcessor(處理被@Autowired注解修飾的bean并注入)
RequiredAnnotationBeanPostProcessor(處理被@Required注解修飾的方法)
CommonAnnotationBeanPostProcessor(處理@PreDestroy@PostConstruct萌腿、@Resource等多個(gè)注解的作用)等限匣。

7、initMessageSource();

初始化國(guó)際化工具類MessageSource

8毁菱、initApplicationEventMulticaster();

初始化事件廣播器

9米死、onRefresh();

模板方法,在容器刷新的時(shí)候可以自定義邏輯贮庞,不同的Spring容器做不同的事情峦筒。

10、registerListeners();

注冊(cè)監(jiān)聽(tīng)器贸伐,廣播early application events

11勘天、finishBeanFactoryInitialization(beanFactory);

實(shí)例化所有剩余的(非懶加載)單例
比如invokeBeanFactoryPostProcessors方法中根據(jù)各種注解解析出來(lái)的類,在這個(gè)時(shí)候都會(huì)被初始化捉邢。
實(shí)例化的過(guò)程各種BeanPostProcessor開(kāi)始起作用脯丝。

12、finishRefresh();

refresh做完之后需要做的其他事情伏伐。
清除上下文資源緩存(如掃描中的ASM元數(shù)據(jù))
初始化上下文的生命周期處理器宠进,并刷新(找出Spring容器中實(shí)現(xiàn)了Lifecycle接口的bean并執(zhí)行start()方法)。
發(fā)布ContextRefreshedEvent事件告知對(duì)應(yīng)的ApplicationListener進(jìn)行響應(yīng)的操作

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末藐翎,一起剝皮案震驚了整個(gè)濱河市材蹬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吝镣,老刑警劉巖堤器,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異末贾,居然都是意外死亡闸溃,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)辉川,“玉大人表蝙,你說(shuō)我怎么就攤上這事∨移欤” “怎么了府蛇?”我有些...
    開(kāi)封第一講書人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)屿愚。 經(jīng)常有香客問(wèn)我汇跨,道長(zhǎng),這世上最難降的妖魔是什么妆距? 我笑而不...
    開(kāi)封第一講書人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任扰法,我火速辦了婚禮,結(jié)果婚禮上毅厚,老公的妹妹穿的比我還像新娘。我一直安慰自己浦箱,他們只是感情好吸耿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著酷窥,像睡著了一般咽安。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蓬推,一...
    開(kāi)封第一講書人閱讀 51,604評(píng)論 1 305
  • 那天妆棒,我揣著相機(jī)與錄音,去河邊找鬼沸伏。 笑死糕珊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的毅糟。 我是一名探鬼主播红选,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼姆另!你這毒婦竟也來(lái)了喇肋?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤迹辐,失蹤者是張志新(化名)和其女友劉穎蝶防,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體明吩,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡间学,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片菱鸥。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宗兼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出氮采,到底是詐尸還是另有隱情殷绍,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布鹊漠,位于F島的核電站主到,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏躯概。R本人自食惡果不足惜登钥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望娶靡。 院中可真熱鬧牧牢,春花似錦、人聲如沸姿锭。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)呻此。三九已至轮纫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間焚鲜,已是汗流浹背掌唾。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留忿磅,地道東北人糯彬。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像贝乎,于是被迫代替她去往敵國(guó)和親情连。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

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

  • 1.1 spring IoC容器和beans的簡(jiǎn)介 Spring 框架的最核心基礎(chǔ)的功能是IoC(控制反轉(zhuǎn))容器览效,...
    simoscode閱讀 6,717評(píng)論 2 22
  • 1.1 Spring IoC容器和bean簡(jiǎn)介 本章介紹了Spring Framework實(shí)現(xiàn)的控制反轉(zhuǎn)(IoC)...
    起名真是難閱讀 2,583評(píng)論 0 8
  • 本文是我自己在秋招復(fù)習(xí)時(shí)的讀書筆記却舀,整理的知識(shí)點(diǎn),也是為了防止忘記锤灿,尊重勞動(dòng)成果挽拔,轉(zhuǎn)載注明出處哦!如果你也喜歡但校,那...
    波波波先森閱讀 12,294評(píng)論 6 86
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理螃诅,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • 本來(lái)是準(zhǔn)備看一看Spring源碼的术裸。然后在知乎上看到來(lái)一個(gè)帖子倘是,說(shuō)有一群**自己連Spring官方文檔都沒(méi)有完全讀...
    此魚不得水閱讀 6,935評(píng)論 4 21