Spring Ioc 源碼簡(jiǎn)單梳理

Spring容器的refresh()【創(chuàng)建刷新】

prepareRefresh()

刷新前的預(yù)處理

  1. initPropertySource() 初始化一些屬性設(shè)置,由子類自定義個(gè)性化的屬性設(shè)置
  2. getEnvironment().validateRequirProperties();檢查屬性的合法性,如一些必須要有的屬性是否存在
  3. earlyApplicationEvents=new LinkedHashSet<ApplicationEvent>();保存容器中的一些早期的事件

obtainFreshBeanFactory()

獲取BeanFactory;

  1. refreshBeanFactory();刷新【創(chuàng)建】BeanFactory;
    創(chuàng)建了一個(gè)this.beanFactory=new DefaultListableBeanFactory();
    對(duì)beanFactory設(shè)置序列化ID
    【Spring 5 會(huì)優(yōu)先判斷beanFactory是否存在,存在就先進(jìn)行清空beanFactory包含里面的bean,并調(diào)用bean的銷毀方法,再重新new一個(gè) DefaultListableBeanFactory對(duì)象作為當(dāng)前beanFactory】
  2. getBeanFactory();返回剛才GenericApplicationContext創(chuàng)建的BeanFactory對(duì)象;
  3. 將創(chuàng)建BeanFactory【DefaultListableBeanFactory】返回

prepareBeanFactory(beanFactory);

BeanFactory的預(yù)準(zhǔn)備工作(BeanFactory進(jìn)行一些設(shè)置)

  1. 設(shè)置BeanFactory的類加載器,支持表達(dá)式解析器...
  2. 添加部分BeanPostProcessor【ApplicationContextAwareProcessor】
  3. 設(shè)置忽略的自動(dòng)裝配的接口EnvironmentAware,EmbeddedValueReslverAware,ResourceLoaderAware,ApplicationEventPublisherAware,MessageSourceAware,ApplicationContextAware,xxx;
  4. 注冊(cè)可以解析的自動(dòng)裝配,我們能直接在任何組件中自動(dòng)注入:BeanFactory,ResourceLoader,ApplicationEventPublisher,ApplicationContext
  5. 添加BeanPostProcessor【ApplicationListenerDetector】【ApplicationListenerDetector就是用于將實(shí)現(xiàn)ApplicationListener的bean添加到ApplicationContext中】
  6. 添加編譯時(shí)的AspectJ
  7. 給BeanFactory中注冊(cè)一些能用的組件:environment【ConfigurableEnvironment】,systemProperties【Map<String,Object>】,systemEnviroment【Map<String,Object>】

postProcessBeanFactory(beanFactory);

BeanFactory準(zhǔn)備工作完成后進(jìn)行的后置處理工作;

  1. 子類通過重新這個(gè)方法來在BeanFactory創(chuàng)建并預(yù)準(zhǔn)備完成以后做進(jìn)一步的設(shè)置

================================以上是BeanFactory的創(chuàng)建以預(yù)準(zhǔn)備工作============================

invokeBeanFactoryPostProcessors(beanFactory)

執(zhí)行BeanFactoryProcessor;
BeanFactoryPostProcessor:BeanFactory的后置處理器。在BeanFactory標(biāo)準(zhǔn)初始化之后執(zhí)行的;
兩個(gè)接口:BeanFactoryPostProcessor,BeanDefinitionRegistryPostProcessor:

  1. 執(zhí)行BeanFactoryPostProcessor方法
    先執(zhí)行BeanDefinitionRegistryPostProcessor:
    1.獲取所有的BeanDefinitionRegistryPostProcessor;
    2.看優(yōu)先級(jí)排序PriorityOrdered優(yōu)先級(jí)接口的BeanDefinitionRegistryPostProcessor;
    postProcessor.postProcessBeanDefinitonRegistry(registry)
    3.再執(zhí)行實(shí)現(xiàn)了Ordered順序接口的BeanDefinitionRegistryPostProcessor;
    postProcessor.postProcessBeanDefinitonRegistry(registry)
    4.最后執(zhí)行沒有實(shí)現(xiàn)任何優(yōu)先級(jí)或是順序接口的BeanDefinitionRegistryPostProcessor;
    postProcessor.postProcessBeanDefinitonRegistry(registry)
    再執(zhí)行BeanFactoryPostProcessor
    1.獲取所有的BeanFactoryPostProcessor;
    2.看優(yōu)先級(jí)排序PriorityOrdered優(yōu)先級(jí)接口的BeanFactoryPostProcessor;
    postProcessor.postPorcessBeanFactory()
    3.再執(zhí)行實(shí)現(xiàn)了Ordered順序接口的BeanFactoryPostProcessor;
    postProcessor.postPorcessBeanFactory()
    4.最后執(zhí)行沒有實(shí)現(xiàn)任何優(yōu)先級(jí)或是順序接口的BeanFactoryPostProcessor;
    postProcessor.postPorcessBeanFactory()

registerBeanPostProcessors(beanFactory)

注冊(cè)BeanPostProcessor(Bean的后置處理器)【intercept bean creation.】
不同接口類型的BeanPostProcessor;在Bean創(chuàng)建前后的執(zhí)行時(shí)機(jī)是不一樣的
BeanPostProcessor,
DestructionAwareBeanPostProcessor,
InstantiationAwareBeanPostProcessor,
SmartInstantiationAwareBeanPostProcessor,
MergedBeanDefinitionPostProcessor【該方法由internalPostProcessors】

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

initMessageSource()

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

  1. 獲取BeanFactory
  2. 看容器中是否有id為messageSource,類型是MessageSource的組件
    如果有賦值給messageSource,如果沒有自己創(chuàng)建一個(gè)DelegatingMessageSource;
    MessageSource:取出國際化配置文件中的某個(gè)key的值,能按照區(qū)域信息獲取
  3. 把創(chuàng)建好的MessageSource注冊(cè)在容器中,以后獲取國際化配置文件的時(shí)候,可以自動(dòng)注入MessageSource,然后調(diào)用它的getMessage方法實(shí)現(xiàn)國際化功能
    beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME,this.messageSource);

initApplicationEventMulticaster()

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

  1. 獲取BeanFactory
  2. 從BeanFactory中獲取applicationEventMulticaster
  3. 如果上一步?jīng)]有配置;創(chuàng)建一個(gè)SimpleApplicationEventMulticaster
  4. 將創(chuàng)建的ApplcaitionEventMulticaster添加到BeanFactory中,以后其他組件自動(dòng)注入

onResfresh()

留給子容器(子類)

  1. 子類重寫這個(gè)方法,在容器刷新的時(shí)候可以自定義邏輯

regsisterListeners()

給容器中將所有項(xiàng)目里面的ApplicationListener注冊(cè)進(jìn)來;

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

finsihBeanFactoryInitialization(beanFactory)

初始化所有剩下的單實(shí)例bean

  1. beanFactory.preInstantiateSingletons();初始化后剩下的單實(shí)例bean;
    1. 獲取容器中的所有bean,依次進(jìn)行初始化和創(chuàng)建對(duì)象
    2. 獲取bean的定義信息:RootBeanDefinition
    3. Bean不是抽象的,是單實(shí)例的,不是懶加載:
      1. 判斷是否是FactoryBean,是否是實(shí)現(xiàn)FactoryBean接口的Bean
      2. 不是工廠Bean。利用getBean(beanName);創(chuàng)建對(duì)象
        1. getBean(beanName);ioc.getBean();
        2. doGetBean(name,null,null,false);
        3. 先獲取緩存中保存的單例Bean。如果能獲取到說明這個(gè)bean之前被創(chuàng)建過(所有創(chuàng)建過的單實(shí)例bean都會(huì)被緩存起來)
          從private final Map<String,Object> singletonObjects=new ConcurrentHashMap<>()獲取
        4. 緩存中獲取不到,開始Bean的創(chuàng)建對(duì)象流程
        5. 標(biāo)記當(dāng)前bean已經(jīng)被創(chuàng)建
        6. 獲取bean的定義信息
        7. 獲取當(dāng)前bean依賴的其他bean;如果按照getBean()把依賴的bean先創(chuàng)建出來。
        8. 啟動(dòng)單實(shí)例bean的創(chuàng)建流程:
          1. createBean(bean,rootBeanDefinition,args);
          2. Object bean=resolveBeforeInstantiation(beanName,mbdToUser);讓BeanPostProcess先嘗試創(chuàng)建代理對(duì)象
            InstantiationAwareBeanPostProcessor:提前執(zhí)行
            先觸發(fā):postProcessBefroeInstantiation();
            如果有返回值:觸發(fā)postProcessAfterInitialization();
          3. 如果前面的InstantiationAwareBeanPostProcessor沒有返回代理對(duì)象:
          4. Object beanInstance=doCreateBean(beanName,mbdToUse,args);
            1. 創(chuàng)建Bean實(shí)例,createBeanInstance(beanName,rootBeanDefinition,args);
              利用工廠方法或者對(duì)象的構(gòu)造器創(chuàng)建出Bean的實(shí)例
            2. applyMergedBeanDefinitionPostProcessor(rootBeanDefinition,beanType,beanName);
              調(diào)用MergedBeanDefinitionPostPorcessor的postProcessMergedBeanDefinition方法。
            3. 【Bean屬性賦值】populateBean(beanName,beanDefinition,instanceWrapper);
              1.拿到InstantiationAwareBeanPostProcessor后置處理器:postProcessAfterInstantiation();
              2.拿到InstantiationAwareBeanPostProcessor后置處理器:
              postProcessPropertyValues();
              1. 應(yīng)用Bean屬性的值;為屬性利用setter方法等進(jìn)行賦值:applyPropertyValues(beanName,beanDefinition,beanWrapper,propertyValues);
            4. 【Bean初始化】initializeBean(beanName,exposedObject,beanDefinition);
              1. 【執(zhí)行Aware接口方法】invokeAwareMethods(beanName,bean);執(zhí)行xxxAware接口方法:BeanNameAware\BeanClassLoaderAware\BeanFactoryAware
              2. 【執(zhí)行后置處理器】:applyBeanPostProcessorsBeforeInsitalization(wrappedBean,beanName)
                BeanPostProcessor.postProcessBeforeInitiaization()
              3. 【執(zhí)行初始化方法】invokeInitMethods(beanName,wrappedName,beanDefinition);
                1. 是否是InitializingBean接口實(shí)現(xiàn);執(zhí)行接口規(guī)定的初始化
                2.是否自定義初始化方法;
              4. 【執(zhí)行后置處理器初始化之后】applyBeanPostProcessorsAfterInitalization
                BeanPostProcessor.postProcessAfterInitiaization()
              5. 注冊(cè)Beande銷毀方法
          5. 將創(chuàng)建的Bean添加到緩存中singletonObjects;
            ioc容器就是這個(gè)Map,很多的Map里面保存了單實(shí)例Bean,環(huán)境信息..
            所有Bean都利用genBean創(chuàng)建完成以后;
            檢查所有Bean是否是SmartInitializingSingleton接口;如果是,就執(zhí)行afterSingletonsInstantiation

finishRefresh()

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

  1. initLifecycleProcessor();初始化和生命周期有關(guān)的后置處理器;LifecycleProessor.
    默認(rèn)從容器中找是否有l(wèi)ifecycleProcessor的組件【LifecycleProessor】;如果沒有new DefaultLifecycleProcessor,并加入都容器中。
    實(shí)現(xiàn)一個(gè)LifecycleProcessor類,beanFactory在此方法回調(diào)LifecycleProcessor的onRefresh()方法,當(dāng)beanFactory銷毀時(shí)候,會(huì)回調(diào)onClose()方法;
  2. getLifecycleProcessor().onRefresh();
    拿到前面定義的生命周期處理器(beanFactory);回調(diào)onRefresh();
  3. publishEvent(new ContextRefreshedEvent(this));發(fā)布容器刷新完成事件
  4. liveBeanView.regsiterApplicationContext(this);

總結(jié)

  1. Spring容器在啟動(dòng)的時(shí)候,先會(huì)保存所有注冊(cè)進(jìn)來的Bean定義信息
    1. xml注冊(cè)bean:<bean>
    2. 注解注冊(cè)Bean:@Service,@Component,@Bean
  2. Spring容器會(huì)合適的時(shí)機(jī)創(chuàng)建這些Bean
    1. 用到這個(gè)bean的時(shí)候;利用genBean創(chuàng)建bean;創(chuàng)建好以后保存在容器中;
    2. 統(tǒng)一創(chuàng)建剩下所有的bean的時(shí)候;finishBeanFactoryInitialization();
  3. 后置處理器
    每一個(gè)bean創(chuàng)建完成,都會(huì)使用各種后置處理進(jìn)行處理;來增強(qiáng)bean的功能;
    AutowiredAnntationBeanPortProcessor:處理自動(dòng)注入
    AnnotationAwareAspectJAutoProxyCreate:來做AOP功能;
    xxx...
    增強(qiáng)的功能注解
    AsyncAnnotationBeanProcessor
    ......
  4. 事件驅(qū)動(dòng)模型:
    ApplicationListener:事件監(jiān)聽;
    ApplicationEventMulticaster:事件派發(fā);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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