Spring IOC源碼分析2——整體流程

1.整體流程概覽

    public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
        this();
        register(annotatedClasses);
        refresh();
    }
    @Override
    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();
            }
        }
    }

2.具體各步驟的工作

2.1、prepareRefresh()

刷新前的預處理

1)initPropertySources()初始化一些屬性設置;子類自定義個性化的屬性設置方法;
2)getEnvironment().validateRequiredProperties();檢驗屬性的合法等
3)earlyApplicationEvents= new LinkedHashSet<ApplicationEvent>();保存容器中的一些早期的事件;

2.2 obtainFreshBeanFactory()

獲取BeanFactory

1)refreshBeanFactory();刷新【創(chuàng)建】BeanFactory;
110行:創(chuàng)建了一個this.beanFactory = new DefaultListableBeanFactory();
設置id;
2)getBeanFactory();返回剛才GenericApplicationContext創(chuàng)建的BeanFactory對象;
3)將創(chuàng)建的BeanFactory【DefaultListableBeanFactory】返回;

2.3 prepareBeanFactory(beanFactory)

BeanFactory的預準備工作(以上創(chuàng)建了beanFactory,現(xiàn)在對BeanFactory對象進行一些設置屬性)
1)設置BeanFactory的類加載器、支持表達式解析器...
2)添加部分BeanPostProcessor【ApplicationContextAwareProcessor】
3)設置忽略的自動裝配的接口EnvironmentAware、EmbeddedValueResolverAware、xxx;
4)注冊可以解析的自動裝配;我們能直接在任何組件中自動注入:
BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext
5)添加BeanPostProcessor【ApplicationListenerDetector】
6)添加編譯時的AspectJ;
7)給BeanFactory中注冊一些能用的組件;
environment【ConfigurableEnvironment】、
systemProperties【Map<String, Object>】、
systemEnvironment【Map<String, Object>】

2.4、postProcessBeanFactory(beanFactory)

BeanFactory準備工作完成后進行的后置處理工作

1)子類通過重寫這個方法來在BeanFactory創(chuàng)建并預準備完成以后做進一步的設置

2.5、invokeBeanFactoryPostProcessors(beanFactory)

執(zhí)行BeanFactoryPostProcessor的方法
BeanFactoryPostProcessor:BeanFactory的后置處理器。在BeanFactory標準初始化之后執(zhí)行的;
兩個接口:BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor

1)先執(zhí)行BeanDefinitionRegistryPostProcessor
?1-1)83行:獲取所有的BeanDefinitionRegistryPostProcessor;
?1-2)86行:看先執(zhí)行實現(xiàn)了PriorityOrdered優(yōu)先級接口的BeanDefinitionRegistryPostProcessor、postProcessor.postProcessBeanDefinitionRegistry(registry)
?1-3)99行:在執(zhí)行實現(xiàn)了Ordered順序接口的BeanDefinitionRegistryPostProcessor;
postProcessor.postProcessBeanDefinitionRegistry(registry)
?1-4)109行:最后執(zhí)行沒有實現(xiàn)任何優(yōu)先級或者是順序接口的BeanDefinitionRegistryPostProcessors;postProcessor.postProcessBeanDefinitionRegistry(registry)

2)再執(zhí)行BeanFactoryPostProcessor的方法
?2-1)139行:獲取所有的BeanFactoryPostProcessor
?2-2)147行:看先執(zhí)行實現(xiàn)了PriorityOrdered優(yōu)先級接口的BeanFactoryPostProcessor、postProcessor.postProcessBeanFactory()
?2-3)167行:在執(zhí)行實現(xiàn)了Ordered順序接口的BeanFactoryPostProcessor;postProcessor.postProcessBeanFactory()
?2-4)175行:最后執(zhí)行沒有實現(xiàn)任何優(yōu)先級或者是順序接口的BeanFactoryPostProcessor;postProcessor.postProcessBeanFactory()

2.6、registerBeanPostProcessors(beanFactory)

注冊BeanPostProcessor(Bean的后置處理器)【 intercept bean creation】
不同接口類型的BeanPostProcessor;在Bean創(chuàng)建前后的執(zhí)行時機是不一樣的
?BeanPostProcessor、
?DestructionAwareBeanPostProcessor、
?InstantiationAwareBeanPostProcessor、(AOP和事務)
?SmartInstantiationAwareBeanPostProcessor、
?MergedBeanDefinitionPostProcessor【internalPostProcessors】、

1)189行:獲取所有的 BeanPostProcessor;后置處理器都默認可以通過PriorityOrdered、Ordered接口來執(zhí)行優(yōu)先級
2)204行:先注冊PriorityOrdered優(yōu)先級接口的BeanPostProcessor;把每一個BeanPostProcessor;添加到BeanFactory中beanFactory.addBeanPostProcessor(postProcessor);
3)224行:再注冊Ordered接口的
4)236行:最后注冊沒有實現(xiàn)任何優(yōu)先級接口的
5)最終注冊MergedBeanDefinitionPostProcessor;
6)注冊一個ApplicationListenerDetector;來在Bean創(chuàng)建完成后檢查是否是ApplicationListener,如果是applicationContext.addApplicationListener((ApplicationListener<?>) bean);

2.7、initMessageSource()

初始化MessageSource組件(做國際化功能;消息綁定,消息解析)

1)718行:獲取BeanFactory
2)719行:看容器中是否有id為messageSource的,類型是MessageSource的組件
?如果有賦值給messageSource,如果沒有自己創(chuàng)建一個DelegatingMessageSource;
?MessageSource:取出國際化配置文件中的某個key的值;能按照區(qū)域信息獲?。?br> 3)739行:把創(chuàng)建好的MessageSource注冊在容器中,以后獲取國際化配置文件的值的時候,可以自動注入MessageSource;
?beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
?MessageSource.getMessage(String code, Object[] args, String defaultMessage, Locale locale);以后可通過getMessage獲取

2.8、initApplicationEventMulticaster()

初始化事件派發(fā)器

1)753行:獲取BeanFactory
2)754行:從BeanFactory中獲取applicationEventMulticaster的ApplicationEventMulticaster;
3)762行:如果上一步?jīng)]有配置;創(chuàng)建一個SimpleApplicationEventMulticaster
4)763行:將創(chuàng)建的ApplicationEventMulticaster添加到BeanFactory中,以后其他組件直接自動注入

2.9、onRefresh()

留給子容器(子類)

1)子類重寫這個方法,在容器刷新的時候可以自定義邏輯;

2.10 registerListeners()

給容器中將所有項目里面的ApplicationListener注冊進來

1)822行:從容器中拿到所有的ApplicationListener
2)824行:將每個監(jiān)聽器添加到事件派發(fā)器中;
?getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
3)832行:派發(fā)之前步驟產(chǎn)生的事件;

2.11 finishBeanFactoryInitialization(beanFactory)

初始化所有剩下的單實例bean
867行:beanFactory.preInstantiateSingletons();初始化后剩下的單實例bean

1)734行:獲取容器中的所有Bean,依次進行初始化和創(chuàng)建對象
2)738行:獲取Bean的定義信息;RootBeanDefinition
3)739行:Bean不是抽象的,是單實例的,是懶加載;
    3-1)740行:判斷是否是FactoryBean;是否是實現(xiàn)FactoryBean接口的Bean;
    3-2)760行:不是工廠Bean。利用getBean(beanName);創(chuàng)建對象
        3-2-0)199行:getBean(beanName); ioc.getBean();
        3-2-1)doGetBean(name, null, null, false);
        3-2-2)246行: getSingleton(beanName)先獲取緩存中保存的單實例Bean《跟進去其實就是從MAP中拿》。如果能獲取到說明這個Bean之前被創(chuàng)建過(所有創(chuàng)建過的單實例Bean都會被緩存起來)
            從private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(256);獲取的
        3-2-3)緩存中獲取不到,開始Bean的創(chuàng)建對象流程;
        3-2-4)287行:標記當前bean已經(jīng)被創(chuàng)建(防止多線程同時創(chuàng)建,使用synchronized)
        3-2-5)291行:獲取Bean的定義信息;
        3-2-6)295行:getDependsOn(),bean.xml里創(chuàng)建person時,加depend-on="jeep,moon"是先把jeep和moon創(chuàng)建出來
            【獲取當前Bean依賴的其他Bean;如果有按照getBean()把依賴的Bean先創(chuàng)建出來;】
        3-2-7)啟動單實例Bean的創(chuàng)建流程;
            3-2-7-1)462行:createBean(beanName, mbd, args);
            3-2-7-2)490行:Object bean = resolveBeforeInstantiation(beanName, mbdToUse);讓BeanPostProcessor先攔截返回代理對象;
                【InstantiationAwareBeanPostProcessor】:提前執(zhí)行;
                先觸發(fā):postProcessBeforeInstantiation();
                如果有返回值:觸發(fā)postProcessAfterInitialization();
            3-2-7-3)如果前面的InstantiationAwareBeanPostProcessor沒有返回代理對象;調(diào)用4)
            3-2-7-4)501行:Object beanInstance = doCreateBean(beanName, mbdToUse, args);創(chuàng)建Bean
                 a)541行:【創(chuàng)建Bean實例】;createBeanInstance(beanName, mbd, args);
                    利用工廠方法或者對象的構造器創(chuàng)建出Bean實例;
                 b)applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
                        調(diào)用MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition(mbd, beanType, beanName);
                 c)578行:【Bean屬性賦值】populateBean(beanName, mbd, instanceWrapper);
                        賦值之前:
                        c-1)拿到InstantiationAwareBeanPostProcessor后置處理器;
                            1305行:postProcessAfterInstantiation();
                        c-2)拿到InstantiationAwareBeanPostProcessor后置處理器;
                            1348行:postProcessPropertyValues();
                        =====賦值之前:===
                        c-3)應用Bean屬性的值;為屬性利用setter方法等進行賦值;
                                applyPropertyValues(beanName, mbd, bw, pvs);
                 d)【Bean初始化】initializeBean(beanName, exposedObject, mbd);
                        d-1)1693行:【執(zhí)行Aware接口方法】invokeAwareMethods(beanName, bean);執(zhí)行xxxAware接口的方法
                           BeanNameAware\BeanClassLoaderAware\BeanFactoryAware
                        d-2)1698行:【執(zhí)行后置處理器初始化之前】applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
                           BeanPostProcessor.postProcessBeforeInitialization();
                        d-3)1702行:【執(zhí)行初始化方法】invokeInitMethods(beanName, wrappedBean, mbd);
                            1)是否是InitializingBean接口的實現(xiàn);執(zhí)行接口規(guī)定的初始化;
                            2)是否自定義初始化方法;
                        d-4)1710行:【執(zhí)行后置處理器初始化之后】applyBeanPostProcessorsAfterInitialization
                            BeanPostProcessor.postProcessAfterInitialization();
                        
            3-2-7-5)將創(chuàng)建的Bean添加到緩存中singletonObjects;sharedInstance = getSingleton(beanName, ()跟進去
              254行:addSingleton(),放到MAP中
              ioc容器就是這些Map;很多的Map里面保存了單實例Bean,環(huán)境信息。。。。;
4)所有Bean都利用getBean創(chuàng)建完成以后;
    檢查所有的Bean是否是SmartInitializingSingleton接口的;如果是;就執(zhí)行afterSingletonsInstantiated();

2.12 finishRefresh()

完成BeanFactory的初始化創(chuàng)建工作,IOC容器就創(chuàng)建完成

1)882行:initLifecycleProcessor();初始化和生命周期有關的后置處理器;LifecycleProcessor
默認從容器中找是否有l(wèi)ifecycleProcessor的組件【LifecycleProcessor】;如果沒有就new DefaultLifecycleProcessor(),加入到容器;
自己也可以嘗試寫一個LifecycleProcessor的實現(xiàn)類,可以在BeanFactory
?void onRefresh();
?void onClose();
2)885行:getLifecycleProcessor().onRefresh();
?拿到前面定義的生命周期處理器(BeanFactory);回調(diào)onRefresh();
3)888行:publishEvent(new ContextRefreshedEvent(this));發(fā)布容器刷新完成事件;
4)891行:liveBeansView.registerApplicationContext(this);

3.IOC容器流程總結

  • 1.Spring容器在啟動的時候,先會保存所有注冊進來的Bean的定義信息
    1)xml注冊bean;<bean>
    2)注解注冊Bean;@Service、@Component、@Bean、xxx

  • 2.Spring容器會合適的時機創(chuàng)建這些Bean
    1)用到這個bean的時候;利用getBean創(chuàng)建bean;創(chuàng)建好以后保存在容器中;
    2)統(tǒng)一創(chuàng)建剩下所有的bean的時候;finishBeanFactoryInitialization();

  • 3.后置處理器——BeanPostProcessor
    1)每一個bean創(chuàng)建完成,都會使用各種后置處理器進行處理;來增強bean的功能;
    AutowiredAnnotationBeanPostProcessor:處理自動注入
    AnnotationAwareAspectJAutoProxyCreator:來做AOP功能;
    ......
    增強的功能注解:
    AsyncAnnotationBeanPostProcessor
    ......

  • 4.事件驅(qū)動模型
    ApplicationListener;事件監(jiān)聽;
    ApplicationEventMulticaster;事件派發(fā):

參考

  • 1)享學課堂James老師筆記
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容