Spring容器的refresh()方法實現

1. prepareRefresh() 刷新前的預處理

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

2. obtainFreshBeanFactory(); 獲取BeanFactory

  1. refreshBeanFactory(); 刷新BeanFactory
    1. 創建一個this.beanFactory = new DefaultListableBeanFactory();
    2. 給beanFactory設置ID
  2. getBeanFactory(); 返回剛剛GenericApplicationContext創建的beanFactory對象
  3. 將創建的DefaultListableBeanFactory返回

3. prepareBeanFactory(beanFactory); beanFactory的預處理準備工作(一般都是一些設置)

  1. 設置BeanFactory的類加載器 支持表達式解析器。。
  2. 添加部分BeanPostProcessor【ApplicationContextAwareProcessor】
  3. 設置忽略的自動裝配的接口 EnvironmentAware EmbeddedValueResolverAware ResourceLoaderAware 不能通過自動注入
  4. 註冊可以解析的自動裝配; 我們可以在任何組件中使用自動注入 BeanFactory ResourceLoader ApplicationContext ApplicationEventPublisher
  5. 添加部分BeanPostProcessor【ApplicationListenerDetector】
  6. 添加編譯時的AspectJ支持
  7. 給BeanFactory中註冊一些能用的組件; environment【ConfigurableEnvironment】 systemProperties【Map】 systemEnvironment【Map】

4. postProcessBeanFactory(beanFactory); BeanFactory準備工作完成後進行的後置處理工作

  1. 子類通過重寫這個方法來在beanFactory創建並準備工作完成以後做進一步的設置

以上是BeanFactory的創建及預準備工作

5. invokeBeanFactoryPostProcessors(beanFactory); BeanFactory的後置處理器,在BeanFactory標準初始化之後BeanFactoryPostProcessor

  • BeanFactoryPostProcessor
  • BeanDefinitionRegistryPostProcessor
  1. 先執行BeanDefinitionRegistryPostProcessor的方法
    1. 獲取所有的BeanDefinitionRegistryPostProcessor
    2. 看先執行實現了PriorityOrdered優先級接口的BeanDefinitionRegistryPostProcessor postProcess.postProcessBeanDefinitionRegistry(registry);
    3. 再執行實現了Ordered順序接口的BeanDefinitionRegistryPostProcessor postProcess.postProcessBeanDefinitionRegistry(registry);
    4. 最後執行沒有實現任何優先級或者順序接口的BeanDefinitionRegistryPostProcessor postProcess.postProcessBeanDefinitionRegistry(registry);
  2. 再執行BeanFactoryPostProcessor的方法
    1. 獲取所有的BeanFactoryPostProcessor
    2. 看先執行實現了PriorityOrdered優先級接口的BeanFactoryPostProcessor postProcessor.postProcessBeanFactory(beanFactory);
    3. 再執行實現了Ordered順序接口的BeanFactoryPostProcessor postProcessor.postProcessBeanFactory(beanFactory);
    4. 最後執行沒有實現任何優先級或者順序接口的BeanFactoryPostProcessor postProcessor.postProcessBeanFactory(beanFactory);

6. registerBeanPostProcessors(beanFactory); 註冊BeanPostProcessor(Bean的後置處理器)【intercept bean creation.】

  • BeanPostProcessor 不同類型的beanPostProcessor在創建bean後的執行時機是不一樣的
  • DestructionAwareBeanPostProcessor
  • InstantiationAwareBeanPostProcessor
  • SmartInstantiationAwareBeanPostProcessor
  • MergedBeanDefinitionPostProcessor 【放入internalPostProcessors】
  1. 獲取所有的BeanPostProcessor; 後置處理器默認都可以通過PriorityOrdered,Ordered指定優先級
  2. 先註冊PriorityOrdered優先級接口的BeanPostProcessor(把每個BeanPostProcessor添加到BeanFactory中) beanFactory.addBeanPostProcessor(beanPostProcessor);
  3. 再註冊Ordered接口的
  4. 註冊沒有實現任何接口的
  5. 最後註冊MergedBeanDefinitionPostProcessor
  6. 註冊一個ApplicationListenerDetector, 來在bean創建完成檢查是否是ApplicationListener。如果是addApplicationListener applicationContext.addApplicationListener((ApplicationListener<?>) bean);

7. initMessageSource(); 初始化MessageSource組件

  • 做國際化功能
  • 消息綁定
  • 消息解析
  1. 獲取beanFactory
  2. 看容器中是否有id爲messageSource的組件。 如果有賦值給this.messageSource,沒有創建一個DelegatingMessageSource
  3. 把創建好的MessageSource註冊到容器中 beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);

8. initApplicationEventMulticaster(); 初始化事件派發器

  1. 獲取beanFactory
  2. 從beanFactory中獲取applicationEventMulticaster
  3. 如果上一步沒配置;創建一個SimpleApplicationEventMulticaster

9. onRefresh(); 留給子容器(子類)

  1. 子類重寫這個方法,在容器刷新的時候可以自定義邏輯 比如: springboot整合tomcat

10. registerListeners(); 給容器中所有的項目裏面的ApplicationListener註冊進來;

  1. 從容器中拿到所有的ApplicationListener
  2. 將每個監聽器添加到事件派發器中 getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
  3. 如果存在earlyApplicationEvents 派發之前步驟產生的事件 getApplicationEventMulticaster().multicastEvent(earlyEvent);

11. finishBeanFactoryInitialization(beanFactory); 初始化所以剩下的單實例bean

  1. beanFactory.preInstantiateSingletons(); 初始化所以剩下的單實例bean
  2. 獲取容器中的所有beanName,依次進行初始化和創建對象
  3. 獲取bean的定義信息RootBeanDefinition
  4. bean不是抽象的,是單實例的,不是懶加載的
    • 判斷是不是FactoryBean,是否實現FactoryBean

    • 不是工廠bean, 通過getBean(beanName)創建對象

      1. DefaultListableBeanFactory getBean(beanName);IOC.getBean()
      2. 調父類AbstractBeanFactory doGetBean(name, null, null, false);
      3. 先獲取單例池中保存的單實例bean,如果能獲取到說明這個bean之前被創建過
      4. 緩存中獲取不到,開始創建流程
      5. 標記當前bean已經被創建 markBeanAsCreated(beanName);
      6. 獲取當前bean的定義信息
      7. 獲取當前bean依賴的其他bean;如果有按照getBean()把依賴的Bean先創建出來
      8. 啓動單實例bean的創建:

      if (mbd.isSingleton()) { sharedInstance = getSingleton(beanName, () -> { return createBean(beanName, mbd, args);

       1. AbstractAutowireCapableBeanFactory createBean(beanName, mbd, args);
       2. Object bean = resolveBeforeInstantiation(beanName, mbdToUse); 讓BeanPostProcessor先攔截創建代理對象
        執行【InstantiationAwareBeanPostProcessor】; 解析配置類會有使用
        先觸發 postProcessBeforeInstantiation(beanClass, beanName);
        後執行 postProcessAfterInitialization(result, beanName);
       3. 如果前面的InstantiationAwareBeanPostProcessor沒有返回代理對象 調用4;
       4. Object beanInstance = doCreateBean(beanName, mbdToUse, args);
               1. 【創建bean實例】 createBeanInstance(beanName, mbd, args);
                  利用工廠方法或者構造器創建出對象
               2. applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);  
                  調用MergedBeanDefinitionPostProcessors
                  bdp.postProcessMergedBeanDefinition(mbd, beanType, beanName);
               3. 提前暴露一個對象
               4. 添加一個緩存
                  addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
               5. 【給bean屬性賦值】 populateBean(beanName, mbd, instanceWrapper);   
                   1. 拿到 InstantiationAwareBeanPostProcessor後置處理器
                       postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)
                   2. 拿到 InstantiationAwareBeanPostProcessor後置處理器
                       postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
                   3. 應用bean屬性的值; 爲屬性利用setter方法進行賦值
                       applyPropertyValues(beanName, mbd, bw, pvs);  
               6. 【bean初始化】initializeBean(beanName, exposedObject, mbd);
                   1. 【執行Aware接口方法】invokeAwareMethods(beanName, bean); 執行 xxxAwarexx方法
                       BeanNameAware  EnvironmentAware ImportAware BeanFactoryAware etc
                   2. 【執行後置處理器初始化之前】applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
                       @PostConstruct 
                       BeanPostProcessor.postProcessBeforeInitialization(result, beanName);  
                   3. 【執行】 invokeInitMethods(beanName, wrappedBean, mbd); 
                       1. 是否是InitializingBean接口的實現; 執行接口規定的初始化方法  
                          ((InitializingBean) bean).afterPropertiesSet();
                       2. 是否自定義初始化方法; xml 中配置  init-method的
                          invokeCustomInitMethod(beanName, bean, mbd);
                   4. 【執行後置處理器初始化之後】 applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
                       BeanPostProcessor.postProcessAfterInitialization(result, beanName); 
               7. registerDisposableBeanIfNecessary(beanName, bean, mbd); 註冊bean的銷燬方法
                   實現 DisposableBean接口的destroy()
       5. 將創建的bean添加的到緩存中 sharedInstance = getSingleton(beanName, () -> {})
           protected void addSingleton(String beanName, Object singletonObject) {
         		synchronized (this.singletonObjects) {
         			this.singletonObjects.put(beanName, singletonObject);
         			this.singletonFactories.remove(beanName);
         			this.earlySingletonObjects.remove(beanName);
         			this.registeredSingletons.add(beanName);
         		}
         	}
      
      1. 所有的bean都使用getBean創建完成以後 檢查所有的bean是SmartInitializingSingleton接口的 @EventListener 如果是執行 afterSingletonsInstantiated();

12. finishRefresh(); 完成bean的初始化創建工作, IOC容器就創建完成

  1. initLifecycleProcessor(); 初始化和生命週期有關的後置處理器; LifecycleProcessor 默認在容器中找是否有LifecycleProcessor類型的組件,沒有創建默認的DefaultLifecycleProcessor。創建完成會加入的容器中 寫一個LifecycleProcessor實現類,可以在BeanFactory刷新完成,關閉的時候調用 void onRefresh(); void onClose();
  2. getLifecycleProcessor().onRefresh(); 拿到前面生命週期處理器(監聽BeanFactory),回調onRefresh()
  3. publishEvent(new ContextRefreshedEvent(this)); 發佈容器刷新完成事件
  4. LiveBeansView.registerApplicationContext(this); Participate in LiveBeansView MBean, if active.

總結

  1. Spring容器在啓動的時候,先回保存所以註冊進來的Bean的定義信息
    1. xml 註冊bean; <bean>
    2. 註解註冊bean 例如 @Component,@Bean,@Service
  2. Spring容器會在何時的時機創建這些Bean
    1. 用到這個bean的時候,利用getBean創建bean,創建好以後保存在容器中
    2. 統一創建剩下所有的bean的時候,finishBeanFactoryInitialization(beanFactory)
  3. 後置處理器: 每個bean創建完成,都會使用各種後置處理器進行處理來增強Bean的功能
    1. AutowiredAnnotationBeanPostProcessor: 處理自動注入
    2. AnnotationAwareAspectJAutoProxyCreator: AOP代理功能
  4. 事件驅動
    1. ApplicationListener: 事件監聽
    2. ApplicationEventMulticaster:事件派發器
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章