spring源碼03——AbstractApplicationContext.refresh()

類名:AbstractApplicationContext

public void refresh() throws BeansException, IllegalStateException {
        synchronized(this.startupShutdownMonitor) {
            this.prepareRefresh();
            ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
            this.prepareBeanFactory(beanFactory);

            try {
                this.postProcessBeanFactory(beanFactory);
                this.invokeBeanFactoryPostProcessors(beanFactory);
                this.registerBeanPostProcessors(beanFactory);
                this.initMessageSource();
                this.initApplicationEventMulticaster();
                this.onRefresh();
                this.registerListeners();
                this.finishBeanFactoryInitialization(beanFactory);
                this.finishRefresh();
            } catch (BeansException var5) {
                this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt", var5);
                this.destroyBeans();
                this.cancelRefresh(var5);
                throw var5;
            }

        }
    }

1、prepareRefresh();

容器刷新前的準備,設置上下文狀態,獲取屬性,驗證必要的屬性等

2、obtainFreshBeanFactory();

獲取新的beanFactory,銷燬原有beanFactory、爲每個bean生成BeanDefinition等

3、prepareBeanFactory(beanFactory);

配置標準的beanFactory,設置ClassLoader,設置SpEL表達式解析器,添加忽略注入的接口,添加bean,添加bean後置處理器等

4、postProcessBeanFactory(beanFactory);

模板方法,此時,所有的beanDefinition已經加載,但是還沒有實例化。
允許在子類中對beanFactory進行擴展處理。比如添加ware相關接口自動裝配設置,添加後置處理器等,是子類擴展prepareBeanFactory(beanFactory)的方法

5、invokeBeanFactoryPostProcessors(beanFactory);

實例化並調用所有註冊的beanFactory後置處理器(實現接口BeanFactoryPostProcessor的bean,在beanFactory標準初始化之後執行)。
例如:
PropertyPlaceholderConfigurer(處理佔位符)

6、registerBeanPostProcessors(beanFactory);

spring源碼04——AbstractApplicationContext.registerBeanPostProcessors
實例化和註冊beanFactory中擴展了BeanPostProcessor的bean。
例如:
AutowiredAnnotationBeanPostProcessor(處理被@Autowired註解修飾的bean並注入)
RequiredAnnotationBeanPostProcessor(處理被@Required註解修飾的方法)
CommonAnnotationBeanPostProcessor(處理@PreDestroy、@PostConstruct、@Resource等多個註解的作用)等。

7、initMessageSource();

初始化國際化工具類MessageSource

8、initApplicationEventMulticaster();

初始化事件廣播器

9、onRefresh();

模板方法,在容器刷新的時候可以自定義邏輯,不同的Spring容器做不同的事情。

10、registerListeners();

註冊監聽器,廣播early application events

11、finishBeanFactoryInitialization(beanFactory);

實例化所有剩餘的(非懶加載)單例
比如invokeBeanFactoryPostProcessors方法中根據各種註解解析出來的類,在這個時候都會被初始化。
實例化的過程各種BeanPostProcessor開始起作用。

12、finishRefresh();

refresh做完之後需要做的其他事情。
清除上下文資源緩存(如掃描中的ASM元數據)
初始化上下文的生命週期處理器,並刷新(找出Spring容器中實現了Lifecycle接口的bean並執行start()方法)。
發佈ContextRefreshedEvent事件告知對應的ApplicationListener進行響應的操作

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章