1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        SpringIOC容器初始化流程12大步源碼解析

        共 54526字,需瀏覽 110分鐘

         ·

        2021-04-06 19:21

        點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”

        優(yōu)質(zhì)文章,第一時(shí)間送達(dá)

        1.概要及IOC容器初始化流程圖

        下面是IOC初始化的完整流程圖








        就以我們new了一個(gè)AnnotationConfigApplicationContext 為例,參數(shù)穿傳的是我們的是我們的主配置類, 配置類就簡單加倆注解@Configuration、@ComponentScan("com.xixi")  ,new 一個(gè)AnnotationConfigApplicationContext 就是創(chuàng)建了一個(gè)IOC容器,里面就進(jìn)行了12個(gè)步驟來初始化容器

         
        //偽代碼 簡單寫下
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
         
        @ComponentScan("com")
        @Configuration
        public class MainConfig {
         
        }

        以下是Spring刷新容器的代碼,Spring中起了個(gè)名叫刷新,其實(shí)就是創(chuàng)建IOC容器,一共就12步 debug逐個(gè)擊破就完了 非常的easy

         @Override  //容器刷新的十二大步。模板模式
         public void refresh() throws BeansException, IllegalStateException {
          synchronized (this.startupShutdownMonitor) {
           StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh");
         
           //1.準(zhǔn)備上下文環(huán)境 Prepare this context for refreshing.
           prepareRefresh();
         
           // Tell the subclass to refresh the internal bean factory.
           // 2.工廠創(chuàng)建:BeanFactory第一次開始創(chuàng)建的時(shí)候,有xml解析邏輯。
           ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
         
           //3.給容器中注冊了環(huán)境信息作為單實(shí)例Bean方便后續(xù)自動(dòng)裝配;放了一些后置處理器處理(監(jiān)聽、xxAware功能) Prepare the bean factory for use in this context.
           prepareBeanFactory(beanFactory);
         
           try {
            //4.留給子類的模板方法,允許子類繼續(xù)對工廠執(zhí)行一些處理; Allows post-processing of the bean factory in context subclasses.
            postProcessBeanFactory(beanFactory);
         
            StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");
            //5.【大核心】工廠增強(qiáng):執(zhí)行所有的BeanFactory后置增強(qiáng)器;利用BeanFactory后置增強(qiáng)器對工廠進(jìn)行修改或者增強(qiáng),配置類會(huì)在這里進(jìn)行解析。 Invoke factory processors registered as beans in the context.
            invokeBeanFactoryPostProcessors(beanFactory);
         
            //6.【核心】注冊所有的Bean的后置處理器 Register bean processors that intercept bean creation.
            registerBeanPostProcessors(beanFactory);
            beanPostProcess.end();
         
            //7.初始化國際化功能 Initialize message source for this context.
            initMessageSource();
         
            //8.初始化事件多播功能(事件派發(fā)) Initialize event multicaster for this context.
            initApplicationEventMulticaster();
         
            //9. Initialize other special beans in specific context subclasses.
            onRefresh();
         
            //10.注冊監(jiān)聽器,從容器中獲取所有的ApplicationListener; Check for listener beans and register them.
            registerListeners();
         
            // Instantiate all remaining (non-lazy-init) singletons.
            //11.【大核心】bean創(chuàng)建;完成 BeanFactory 初始化。(工廠里面所有的組件都好了)
            finishBeanFactoryInitialization(beanFactory);
         
            //12.發(fā)布事件 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();
            contextRefresh.end();
           }
          }
         }

        2.AnnotationConfigApplicationContext構(gòu)造器

        分析12大步之前先看下this()里邊干了啥

        public AnnotationConfigApplicationContext(Class<?>... componentClasses) {
          this();
          register(componentClasses);
          refresh(); //容器完整刷新(創(chuàng)建出所有組件,組織好所有功能)
         }

         下面是this中的代碼,可以看到主要就創(chuàng)建了倆基礎(chǔ)組件  AnnotatedBeanDefinitionReader Bean定義的讀取器,ClassPathBeanDefinitionScanner bean定義的掃描器,用來掃描指定路徑下所有的bean信息

        public AnnotationConfigApplicationContext() {
          StartupStep createAnnotatedBeanDefReader = this.getApplicationStartup().start("spring.context.annotated-bean-reader.create");
          this.reader = new AnnotatedBeanDefinitionReader(this);
          createAnnotatedBeanDefReader.end();
          this.scanner = new ClassPathBeanDefinitionScanner(this);
         }

        重點(diǎn)看下創(chuàng)建讀取器過程,里面調(diào)用了registerAnnotationConfigProcessors方法給工廠創(chuàng)建了很多基礎(chǔ)組件,各種解析器

         public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry, Environment environment) {
          Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
          Assert.notNull(environment, "Environment must not be null");
          this.registry = registry;
          this.conditionEvaluator = new ConditionEvaluator(registry, environment, null);
          AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
         }

        可以看到里面注冊了ConfigurationClassPostProcessor 配置類的后置處理器,我們加了@Configuration注解的類就是用這個(gè)處理器來解析的,還有AutowiredAnnotationBeanPostProcessor自動(dòng)化裝配相關(guān)的后置處理器等等

         public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors(
           BeanDefinitionRegistry registry, @Nullable Object source) {
         
          DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry);
          if (beanFactory != null) {
           if (!(beanFactory.getDependencyComparator() instanceof AnnotationAwareOrderComparator)) {
            beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
           }
           if (!(beanFactory.getAutowireCandidateResolver() instanceof ContextAnnotationAutowireCandidateResolver)) {
            beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());
           }
          }
         
          Set<BeanDefinitionHolder> beanDefs = new LinkedHashSet<>(8);
          //注冊底層的  配置文件處理器
          if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) {
           RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);
           def.setSource(source);
           beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));
          }
                //注冊底層的自動(dòng)裝配處理器
          if (!registry.containsBeanDefinition(AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {
           RootBeanDefinition def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class);
           def.setSource(source);
           beanDefs.add(registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
          }
                //注冊支持JSR-250的處理
          // Check for JSR-250 support, and if present add the CommonAnnotationBeanPostProcessor.
          if (jsr250Present && !registry.containsBeanDefinition(COMMON_ANNOTATION_PROCESSOR_BEAN_NAME)) {
           RootBeanDefinition def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class);
           def.setSource(source);
           beanDefs.add(registerPostProcessor(registry, def, COMMON_ANNOTATION_PROCESSOR_BEAN_NAME));
          }
         
          // Check for JPA support, and if present add the PersistenceAnnotationBeanPostProcessor.
          if (jpaPresent && !registry.containsBeanDefinition(PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME)) {
           RootBeanDefinition def = new RootBeanDefinition();
           try {
            def.setBeanClass(ClassUtils.forName(PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME,
              AnnotationConfigUtils.class.getClassLoader()));
           }
           catch (ClassNotFoundException ex) {
            throw new IllegalStateException(
              "Cannot load optional framework class: " + PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME, ex);
           }
           def.setSource(source);
           beanDefs.add(registerPostProcessor(registry, def, PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME));
          }
         
          if (!registry.containsBeanDefinition(EVENT_LISTENER_PROCESSOR_BEAN_NAME)) {
           RootBeanDefinition def = new RootBeanDefinition(EventListenerMethodProcessor.class);
           def.setSource(source);
           beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_PROCESSOR_BEAN_NAME));
          }
         
          if (!registry.containsBeanDefinition(EVENT_LISTENER_FACTORY_BEAN_NAME)) {
           RootBeanDefinition def = new RootBeanDefinition(DefaultEventListenerFactory.class);
           def.setSource(source);
           beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_FACTORY_BEAN_NAME));
          }
         
          return beanDefs;
         }

        this()里邊就是定義一些Spring容器底層用到的一些基礎(chǔ)組件。


        然后看下一步register(componentClasses);方法,componentClasses是我們的主配置類,是個(gè)可變參數(shù)我們可以傳多個(gè),然后i就全部注冊到工廠里存著 也是解析成BeanDefinition存到Map里

         @Override
         public void register(Class<?>... componentClasses) {
          Assert.notEmpty(componentClasses, "At least one component class must be specified");
          StartupStep registerComponentClass = this.getApplicationStartup().start("spring.context.component-classes.register")
            .tag("classes", () -> Arrays.toString(componentClasses));
          this.reader.register(componentClasses);
          registerComponentClass.end();
         }


        3.第一步--prepareRefresh()準(zhǔn)備上下文環(huán)境

        容器刷新的12大步是在 AbstractApplicationContext 抽象類中進(jìn)行,說明AbstractApplicationContext是個(gè)模板類,定義了容器初始化的基本步驟,不一定每個(gè)方法都是他來實(shí)現(xiàn)。

         protected void prepareRefresh() {
          // Switch to active.
          this.startupDate = System.currentTimeMillis();
          this.closed.set(false);
          this.active.set(true);
         
          if (logger.isDebugEnabled()) {
           if (logger.isTraceEnabled()) {
            logger.trace("Refreshing " + this);
           }
           else {
            logger.debug("Refreshing " + getDisplayName());
           }
          }
         
          //其他子容器自行實(shí)現(xiàn)(比如:WebApplicationContext) Initialize any placeholder property sources in the context environment.
          initPropertySources();
         
          //準(zhǔn)備環(huán)境變量信息 Validate that all properties marked as required are resolvable:
          // see ConfigurablePropertyResolver#setRequiredProperties
          getEnvironment().validateRequiredProperties();
         
          // 存儲(chǔ)子容器早期運(yùn)行的一些監(jiān)聽器; Store pre-refresh ApplicationListeners...
          if (this.earlyApplicationListeners == null) {
           this.earlyApplicationListeners = new LinkedHashSet<>(this.applicationListeners);
          }
          else {
           // Reset local application listeners to pre-refresh state.
           this.applicationListeners.clear();
           this.applicationListeners.addAll(this.earlyApplicationListeners);
          }
         
          //早期的一些時(shí)間存儲(chǔ)到這里 Allow for the collection of early ApplicationEvents,
          // to be published once the multicaster is available...
          this.earlyApplicationEvents = new LinkedHashSet<>();
         }


        1.前邊三行代碼記錄下容器啟動(dòng)時(shí)間,關(guān)閉狀態(tài)設(shè)置成false,活躍狀態(tài)設(shè)置為true,很好理解。


        2.然后 initPropertySources 這個(gè)方法在AbstractApplicationContext中就沒有實(shí)現(xiàn),而是交給子類實(shí)現(xiàn),這個(gè)方法可以定義一些自己的初始化操作。比如Web環(huán)境下的IOC容器就在這加載一些應(yīng)用上下文信息


        3.getEnvironment().validateRequiredProperties(); 方法創(chuàng)建了 StandardEnvironment環(huán)境對象,debug下可以看到首先拿到了一些我們系統(tǒng)的環(huán)境變量,比如JAVA_HOME ,系統(tǒng)時(shí)間等等


        4.存儲(chǔ)一些早期的監(jiān)聽器,如果是單純的IOC環(huán)境,暫時(shí)沒有任何監(jiān)聽器存在,到此IOC容器刷新第一步準(zhǔn)備環(huán)境上下文就結(jié)束了


         

        4.第二步創(chuàng)建工廠實(shí)例

        obtainFreshBeanFactory方法返回了在this()階段就創(chuàng)建好的工廠實(shí)例, 說明ApplicationContext其實(shí)并沒有實(shí)現(xiàn)任何的創(chuàng)建bean的功能,而是組合持有了工廠來配合實(shí)現(xiàn)整個(gè)流程

           // 2.工廠創(chuàng)建:BeanFactory第一次開始創(chuàng)建的時(shí)候,有xml解析邏輯。
           ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

        5. 第三步預(yù)準(zhǔn)備工廠

        這個(gè)階段繼續(xù)創(chuàng)建了一些Spring底層用到的基礎(chǔ)組件,例如StandardBeanExpressionResolver EL表達(dá)式的解析器 解析 ${}這些玩意的,還有ResourceEditorRegistrar資源解析器,基礎(chǔ)的后置處理器ApplicationContextAwareProcessor(判斷那些實(shí)現(xiàn)Aware接口)等


        最后還把一些默認(rèn)組件放到了單例池子

        protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
          // Tell the internal bean factory to use the context's class loader etc.
          beanFactory.setBeanClassLoader(getClassLoader());
          if (!shouldIgnoreSpel) { //解釋器模式  ${ }
           beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
          }
          beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));
         
          // Configure the bean factory with context callbacks.
          beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this)); //準(zhǔn)備一個(gè)處理Aware接口功能的后置處理器
          beanFactory.ignoreDependencyInterface(EnvironmentAware.class); //告訴Spring先別管這些接口
          beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
          beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
          beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
          beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
          beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
          beanFactory.ignoreDependencyInterface(ApplicationStartupAware.class);
         
          //注冊可以解析到的依賴 BeanFactory interface not registered as resolvable type in a plain factory.
          // MessageSource registered (and found for autowiring) as a bean.
          beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
          beanFactory.registerResolvableDependency(ResourceLoader.class, this);
          beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
          beanFactory.registerResolvableDependency(ApplicationContext.class, this);
         
          // Register early post-processor for detecting inner beans as ApplicationListeners.
          beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));
         
          // Detect a LoadTimeWeaver and prepare for weaving, if found.
          if (!NativeDetector.inNativeImage() && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
           beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
           // Set a temporary ClassLoader for type matching.
           beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
          }
         
          //注冊默認(rèn)組件: Register default environment beans.
          if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
           beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
          }
          if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
           beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
          }
          if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
           beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
          }
          if (!beanFactory.containsLocalBean(APPLICATION_STARTUP_BEAN_NAME)) {
           beanFactory.registerSingleton(APPLICATION_STARTUP_BEAN_NAME, getApplicationStartup());
          }
         }

        6.第四步postProcessBeanFactory

        postProcessBeanFactory這個(gè)方法工廠沒有實(shí)現(xiàn) 是留給子類的模板方法,允許子類繼承對工廠執(zhí)行一些處理


        7. 第五步執(zhí)行所有的BeanFactory后置增強(qiáng)器

          這里邊調(diào)用了

        PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());來執(zhí)行所有的工廠增強(qiáng)器


          PostProcessorRegistrationDelegate類可以說是一個(gè)門面模式或者一個(gè)裝飾者,他用來處理Spring的所有后置處理器

         protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
          PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors()); //執(zhí)行所有的工廠增強(qiáng)器
          //上面的類叫:后置處理器的注冊代理(門面模式-裝飾模式)
          // Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime
          // (e.g. through an @Bean method registered by ConfigurationClassPostProcessor)
          if (!NativeDetector.inNativeImage() && beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
           beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
           beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
          }
         }

        此方法執(zhí)行了所有的BeanFactory的后置處理器,BeanFactory的后置處理器一共兩種 BeanDefinitionRegistryPostProcessor 和 BeanFactoryPostProcessor。


        先執(zhí)行默認(rèn)的處理器,-> 然后再取出實(shí)現(xiàn)了PriorityOrdered排序接口的處理器進(jìn)行排序,執(zhí)行處理器  ->接下來取出實(shí)現(xiàn)了Ordered排序接口的的處理器,排序然后執(zhí)行。  兩類處理器都是這個(gè)執(zhí)行流程

         //執(zhí)行工廠的后置處理器
         public static void invokeBeanFactoryPostProcessors(
           ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
         
          // WARNING: Although it may appear that the body of this method can be easily
          // refactored to avoid the use of multiple loops and multiple lists, the use
          // of multiple lists and multiple passes over the names of processors is
          // intentional. We must ensure that we honor the contracts for PriorityOrdered
          // and Ordered processors. Specifically, we must NOT cause processors to be
          // instantiated (via getBean() invocations) or registered in the ApplicationContext
          // in the wrong order.
          //
          // Before submitting a pull request (PR) to change this method, please review the
          // list of all declined PRs involving changes to PostProcessorRegistrationDelegate
          // to ensure that your proposal does not result in a breaking change:
          // https://github.com/spring-projects/spring-framework/issues?q=PostProcessorRegistrationDelegate+is%3Aclosed+label%3A%22status%3A+declined%22
         
          // Invoke BeanDefinitionRegistryPostProcessors first, if any.
          Set<String> processedBeans = new HashSet<>();
         
          if (beanFactory instanceof BeanDefinitionRegistry) {
           BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
           List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
           List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
           //先拿到底層默認(rèn)有的BeanFactoryPostProcessor
           for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
            if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
             BeanDefinitionRegistryPostProcessor registryProcessor =
               (BeanDefinitionRegistryPostProcessor) postProcessor;
             registryProcessor.postProcessBeanDefinitionRegistry(registry);
             registryProcessors.add(registryProcessor);
            }
            else {
             regularPostProcessors.add(postProcessor);
            }
           }
         
           // Do not initialize FactoryBeans here: We need to leave all regular beans
           // uninitialized to let the bean factory post-processors apply to them!
           // Separate between BeanDefinitionRegistryPostProcessors that implement
           // PriorityOrdered, Ordered, and the rest.
           List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();
         
           // 首先:從工廠中獲取所有的實(shí)現(xiàn)了 PriorityOrdered 接口的 BeanDefinitionRegistryPostProcessor; First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
           String[] postProcessorNames =
             beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, truefalse); //拿到系統(tǒng)中每一個(gè)組件的BD信息,進(jìn)行類型對比,是否匹配指定的類型
           for (String ppName : postProcessorNames) {
            if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
             currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));//從工廠中獲取這個(gè)組件【getBean整個(gè)組件創(chuàng)建的流程】并放到這個(gè)集合
             processedBeans.add(ppName);
            }
           } //下面利用優(yōu)先級排序
           sortPostProcessors(currentRegistryProcessors, beanFactory);
           registryProcessors.addAll(currentRegistryProcessors);
           invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup()); //執(zhí)行這些BeanDefinitionRegistryPostProcessor的
           currentRegistryProcessors.clear();
         
           // 接下來,獲取所有實(shí)現(xiàn)了Ordered接口的 BeanDefinitionRegistryPostProcessor Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.
           postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, truefalse);
           for (String ppName : postProcessorNames) {
            if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
             currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
             processedBeans.add(ppName); //即使實(shí)現(xiàn)了 PriorityOrdered 和Ordered,也是以 PriorityOrdered
            }
           }//排序
           sortPostProcessors(currentRegistryProcessors, beanFactory);
           registryProcessors.addAll(currentRegistryProcessors);
           invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup()); //執(zhí)行
           currentRegistryProcessors.clear();
         
           // 最后,我們自定義的一般沒有任何優(yōu)先級和排序接口   Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
           boolean reiterate = true;
           while (reiterate) {
            reiterate = false;
            postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, truefalse);//拿到所有的BeanDefinitionRegistryPostProcessor
            for (String ppName : postProcessorNames) {
             if (!processedBeans.contains(ppName)) {
              currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
              processedBeans.add(ppName);
              reiterate = true;
             }
            }//排序,根據(jù)類名大小寫進(jìn)行排序
            sortPostProcessors(currentRegistryProcessors, beanFactory);
            registryProcessors.addAll(currentRegistryProcessors);
            invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup());
            currentRegistryProcessors.clear(); //防止重復(fù)執(zhí)行
           }
         
           // 接下來,再來執(zhí)行postProcessBeanFactory的回調(diào), Now, invoke the postProcessBeanFactory callback of all processors handled so far.
           invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
           invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
          }
         
          else {
           // Invoke factory processors registered with the context instance.
           invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
          }
          //以前在執(zhí)行 BeanDefinitionRegistryPostProcessor ,以后來執(zhí)行 BeanFactoryPostProcessor
          // Do not initialize FactoryBeans here: We need to leave all regular beans
          // uninitialized to let the bean factory post-processors apply to them!
          String[] postProcessorNames =
            beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, truefalse);
         
          // Separate between BeanFactoryPostProcessors that implement PriorityOrdered,
          // Ordered, and the rest.
          List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
          List<String> orderedPostProcessorNames = new ArrayList<>();
          List<String> nonOrderedPostProcessorNames = new ArrayList<>();
          for (String ppName : postProcessorNames) {
           if (processedBeans.contains(ppName)) {
            // skip - already processed in first phase above
           }
           else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
            priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
           }
           else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
            orderedPostProcessorNames.add(ppName);
           }
           else {
            nonOrderedPostProcessorNames.add(ppName);
           }
          }
         
          // 首先執(zhí)行所有實(shí)現(xiàn)了 PriorityOrdered 的 BeanFactoryPostProcessor;First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.
          sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
          invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
         
          // 接下來執(zhí)行,實(shí)現(xiàn)了 Ordered 接口的 BeanFactoryPostProcessor  Next, invoke the BeanFactoryPostProcessors that implement Ordered.
          List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
          for (String postProcessorName : orderedPostProcessorNames) {
           orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
          }
          sortPostProcessors(orderedPostProcessors, beanFactory);
          invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
         
          // 最后執(zhí)行沒有任何優(yōu)先級和排序接口的 BeanFactoryPostProcessor Finally, invoke all other BeanFactoryPostProcessors.
          List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
          for (String postProcessorName : nonOrderedPostProcessorNames) {
           nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
          }
          invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory); //執(zhí)行所有的 BeanFactoryPostProcessor
         
          // Clear cached merged bean definitions since the post-processors might have
          // modified the original metadata, e.g. replacing placeholders in values...
          beanFactory.clearMetadataCache();
         }

        8. 第六步注冊所有的bean的后置處理器 BeanPostProcessors

        取出所有的BeanPostProcessor后置處理器,該排序的排序,然后全都放到容器的集合中


        容器有一個(gè)集合屬性來保存所有的BeanPostProcessor

        /** BeanPostProcessors to apply. 保存了所有的Bean后置增強(qiáng)器 */
        private final List<BeanPostProcessor> beanPostProcessors = new BeanPostProcessorCacheAwareList();
         public static void registerBeanPostProcessors(
           ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
         
          // WARNING: Although it may appear that the body of this method can be easily
          // refactored to avoid the use of multiple loops and multiple lists, the use
          // of multiple lists and multiple passes over the names of processors is
          // intentional. We must ensure that we honor the contracts for PriorityOrdered
          // and Ordered processors. Specifically, we must NOT cause processors to be
          // instantiated (via getBean() invocations) or registered in the ApplicationContext
          // in the wrong order.
          //
          // Before submitting a pull request (PR) to change this method, please review the
          // list of all declined PRs involving changes to PostProcessorRegistrationDelegate
          // to ensure that your proposal does not result in a breaking change:
          // https://github.com/spring-projects/spring-framework/issues?q=PostProcessorRegistrationDelegate+is%3Aclosed+label%3A%22status%3A+declined%22
          //獲取到容器中所有的 BeanPostProcessor; Bean的后置處理器
          String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, truefalse);
         
          // Register BeanPostProcessorChecker that logs an info message when
          // a bean is created during BeanPostProcessor instantiation, i.e. when
          // a bean is not eligible for getting processed by all BeanPostProcessors.
          int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
          beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
         
          // Separate between BeanPostProcessors that implement PriorityOrdered,
          // Ordered, and the rest.
          List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
          List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
          List<String> orderedPostProcessorNames = new ArrayList<>();
          List<String> nonOrderedPostProcessorNames = new ArrayList<>();
          for (String ppName : postProcessorNames) {
           if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {  //獲取所有實(shí)現(xiàn)了 PriorityOrdered 的 BeanPostProcessor
            BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
            priorityOrderedPostProcessors.add(pp);
            if (pp instanceof MergedBeanDefinitionPostProcessor) {
             internalPostProcessors.add(pp);
            }
           }
           else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
            orderedPostProcessorNames.add(ppName);
           }
           else {
            nonOrderedPostProcessorNames.add(ppName);
           }
          }
         
          //首先,注冊所有的實(shí)現(xiàn)了 PriorityOrdered 的 BeanPostProcessor ;  First, register the BeanPostProcessors that implement PriorityOrdered.
          sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
          registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
         
          //接下來,注冊所有的實(shí)現(xiàn)了 Ordered 的 BeanPostProcessor  Next, register the BeanPostProcessors that implement Ordered.
          List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
          for (String ppName : orderedPostProcessorNames) {
           BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); //獲取后置處理器對象
           orderedPostProcessors.add(pp);
           if (pp instanceof MergedBeanDefinitionPostProcessor) {
            internalPostProcessors.add(pp);
           }
          }
          sortPostProcessors(orderedPostProcessors, beanFactory);
          registerBeanPostProcessors(beanFactory, orderedPostProcessors);
         
          // 最后,注冊所有普通的 BeanPostProcessor ;Now, register all regular BeanPostProcessors.
          List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
          for (String ppName : nonOrderedPostProcessorNames) {
           BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); //從容器中獲取這個(gè)組件
           nonOrderedPostProcessors.add(pp);
           if (pp instanceof MergedBeanDefinitionPostProcessor) {
            internalPostProcessors.add(pp);
           }
          }
          registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
         
          //最后,重新注冊所有internal的BeanPostProcessors  Finally, re-register all internal BeanPostProcessors.
          sortPostProcessors(internalPostProcessors, beanFactory);
          registerBeanPostProcessors(beanFactory, internalPostProcessors);
         
          // 重新注冊一下這個(gè)后置處理器 Re-register post-processor for detecting inner beans as ApplicationListeners,
          // 把他放到后置處理器的最后一位; moving it to the end of the processor chain (for picking up proxies etc).
          beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
         }

        9. 第七步初始化國際化組件

        MESSAGE_SOURCE_BEAN_NAME 對應(yīng)的值是 "messageSource", 先從容器中拿一個(gè)名為 “messageSource” 類型為MessageSource的組件,拿到就賦值給工廠,拿不到就創(chuàng)建個(gè)DelegatingMessageSource類型的組件
         protected void initMessageSource() {
          ConfigurableListableBeanFactory beanFactory = getBeanFactory();
          if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
           this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);
           // Make MessageSource aware of parent MessageSource.
           if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {
            HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;
            if (hms.getParentMessageSource() == null) {
             // Only set parent context as parent MessageSource if no parent MessageSource
             // registered already.
             hms.setParentMessageSource(getInternalParentMessageSource());
            }
           }
           if (logger.isTraceEnabled()) {
            logger.trace("Using MessageSource [" + this.messageSource + "]");
           }
          }
          else {
           // Use empty MessageSource to be able to accept getMessage calls.
           DelegatingMessageSource dms = new DelegatingMessageSource();
           dms.setParentMessageSource(getInternalParentMessageSource());
           this.messageSource = dms;
           beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
           if (logger.isTraceEnabled()) {
            logger.trace("No '" + MESSAGE_SOURCE_BEAN_NAME + "' bean, using [" + this.messageSource + "]");
           }
          }
         }

        10. 第八步初始化事件多播器組件

        先從容器中拿一個(gè)名為applicationEventMulticaster的組件,拿到設(shè)置給容器。拿不到就創(chuàng)建一個(gè)簡單的事件多播器


           Spring監(jiān)聽器是觀察者模式的應(yīng)用。

         protected void initApplicationEventMulticaster() {
          ConfigurableListableBeanFactory beanFactory = getBeanFactory();
          if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
           this.applicationEventMulticaster =
             beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
           if (logger.isTraceEnabled()) {
            logger.trace("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");
           }
          }
          else {
           this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
           beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster); //注冊一個(gè)事件派發(fā)器
           if (logger.isTraceEnabled()) {
            logger.trace("No '" + APPLICATION_EVENT_MULTICASTER_BEAN_NAME + "' bean, using " +
              "[" + this.applicationEventMulticaster.getClass().getSimpleName() + "]");
           }
          }
         }

        11. 第九步onRefresh

        這一步啥也沒實(shí)現(xiàn),也是留給子類實(shí)現(xiàn)的


        12. 第十步注冊早期的監(jiān)聽器

         /** 多播器和監(jiān)聽器是觀察者模式(里面包含了所有的監(jiān)聽器)
          * Add beans that implement ApplicationListener as listeners.
          * Doesn't affect other listeners, which can be added without being beans.
          */
         protected void registerListeners() {
          //把所有監(jiān)聽器保存到多播器的集合中 Register statically specified listeners first.
          for (ApplicationListener<?> listener : getApplicationListeners()) {
           getApplicationEventMulticaster().addApplicationListener(listener);
          }
         
          // Do not initialize FactoryBeans here: We need to leave all regular beans
          // uninitialized to let post-processors apply to them! 獲取ApplicationListener在ioc容器中注冊的bean的名字
          String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
          for (String listenerBeanName : listenerBeanNames) {
           getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName); //獲取所有的容器中的監(jiān)聽器,并保存他們的名字
          }
         
          //派發(fā)之前攢的一些早期事件 Publish early application events now that we finally have a multicaster...
          Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;
          this.earlyApplicationEvents = null;
          if (!CollectionUtils.isEmpty(earlyEventsToProcess)) {
           for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
            getApplicationEventMulticaster().multicastEvent(earlyEvent);
           }
          }
         }

        13.  第十一步大大核心 完成BeanFactory初始化, 創(chuàng)建所有組件

          這個(gè)方法最重要一步是preInstantiateSingletons()方法,這里面初始化所有非懶加載的單例bean

         protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
          // 給工廠設(shè)置好 ConversionService【負(fù)責(zé)類型轉(zhuǎn)換的組件服務(wù)】, Initialize conversion service for this context.
          if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&
            beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {
           beanFactory.setConversionService(
             beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));
          }
         
          // 注冊一個(gè)默認(rèn)的值解析器("${}")  ;Register a default embedded value resolver if no BeanFactoryPostProcessor
          // (such as a PropertySourcesPlaceholderConfigurer bean) registered any before:
          // at this point, primarily for resolution in annotation attribute values.
          if (!beanFactory.hasEmbeddedValueResolver()) {
           beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));
          }
         
          // LoadTimeWeaverAware;aspectj:加載時(shí)織入功能【aop】。 Initialize LoadTimeWeaverAware beans early to allow for registering their transformers early.
          String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, falsefalse);
          for (String weaverAwareName : weaverAwareNames) {
           getBean(weaverAwareName); //從容器中獲取組件,有則直接獲取,沒則進(jìn)行創(chuàng)建
          }
         
          // Stop using the temporary ClassLoader for type matching.
          beanFactory.setTempClassLoader(null);
         
          // Allow for caching all bean definition metadata, not expecting further changes.
          beanFactory.freezeConfiguration();
         
          // Instantiate all remaining (non-lazy-init) singletons.
          //初始化所有的非懶加載的單實(shí)例Bean
          beanFactory.preInstantiateSingletons();
         }

         這個(gè)方法維護(hù)了Bean的整個(gè)生命周期, 其中包含 實(shí)例化Bean ->屬性注入 -> 到初始化Bean,以及在實(shí)例化前后,屬性注入的自動(dòng)裝配,初始化前后執(zhí)行了所有的BeanPostProcessor后置處理器,例如AOP,事務(wù)等就是利用后置處理器在Bean的生命周期的某個(gè)時(shí)期進(jìn)行干預(yù)的。


         里面代碼量很大不在此文中詳細(xì)展開講了。大致邏輯就是 遍歷所有BeanName 然后通過BeanName獲取Bean的定義BeanDefinition,接著一些華麗唿哨判斷,例如是否單例,是否抽象,是否是FactoryBean類型的,不是的話走普通創(chuàng)建邏輯, 還有處理循環(huán)依賴等等很多很多


        Spring中所有組件都是通過getBean方法獲取的,getBean里邊邏輯就是先從單例池獲取,獲取不到再創(chuàng)建。


        Spring容器刷新最重要的部分就在這了

         @Override
         public void preInstantiateSingletons() throws BeansException {
          if (logger.isTraceEnabled()) {
           logger.trace("Pre-instantiating singletons in " + this);
          }
         
          // Iterate over a copy to allow for init methods which in turn register new bean definitions.
          // While this may not be part of the regular factory bootstrap, it does otherwise work fine.
          List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
         
          // 創(chuàng)建出所有的單實(shí)例Bean;Trigger initialization of all non-lazy singleton beans...
          for (String beanName : beanNames) {
           RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName); //開始解析文件的時(shí)候每一個(gè)bean標(biāo)簽被解析封裝成一個(gè)BeanDefinition
           if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
            if (isFactoryBean(beanName)) { //如果是FactoryBean則執(zhí)行下面邏輯
             Object bean = getBean(FACTORY_BEAN_PREFIX + beanName); //得到HelloFactory
             if (bean instanceof FactoryBean) {
              FactoryBean<?> factory = (FactoryBean<?>) bean;
              boolean isEagerInit;
              if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
               isEagerInit = AccessController.doPrivileged(
                 (PrivilegedAction<Boolean>) ((SmartFactoryBean<?>) factory)::isEagerInit,
                 getAccessControlContext());
              }
              else {
               isEagerInit = (factory instanceof SmartFactoryBean &&
                 ((SmartFactoryBean<?>) factory).isEagerInit());
              }
              if (isEagerInit) {
               getBean(beanName);
              }
             }
            }
            else { //不是FactoryBean則執(zhí)行這個(gè),普通的單實(shí)例非懶加載bean的創(chuàng)建
             getBean(beanName); //
            }
           }
          }
         
          // 觸發(fā) post-initialization 邏輯;  Trigger post-initialization callback for all applicable beans...
          for (String beanName : beanNames) {
           Object singletonInstance = getSingleton(beanName);
           if (singletonInstance instanceof SmartInitializingSingleton) {
            StartupStep smartInitialize = this.getApplicationStartup().start("spring.beans.smart-initialize")
              .tag("beanName", beanName);
            SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
            if (System.getSecurityManager() != null) {
             AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
              smartSingleton.afterSingletonsInstantiated();
              return null;
             }, getAccessControlContext());
            }
            else {
             smartSingleton.afterSingletonsInstantiated();
            }
            smartInitialize.end();
           }
          }
         }

        14. 第十二步 收尾工作finishRefresh

         最后收尾工作很簡單了 清理下不用的緩存 ,初始化個(gè)LifecycleProcessor類型處理器,干嘛用的我也不知道,發(fā)布下容器刷新完成的事件。完事  至此SpringIOC容器的創(chuàng)建過程就完全結(jié)束了。

         protected void finishRefresh() {
          // Clear context-level resource caches (such as ASM metadata from scanning).
          clearResourceCaches();
         
          // Initialize lifecycle processor for this context.
          initLifecycleProcessor();
         
          //告訴LifecycleProcessor容器onRefresh Propagate refresh to lifecycle processor first.
          getLifecycleProcessor().onRefresh();
         
          //發(fā)布事件 Publish the final event.
          publishEvent(new ContextRefreshedEvent(this));
         
          //jconsole(暴露MBean端點(diǎn)信息) Participate in LiveBeansView MBean, if active.
          if (!NativeDetector.inNativeImage()) {
           LiveBeansView.registerApplicationContext(this);
          }
         }

        ————————————————

        版權(quán)聲明:本文為CSDN博主「飛翔的小羊」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。

        原文鏈接:

        https://blog.csdn.net/qq_39364985/article/details/115308960




        鋒哥最新SpringCloud分布式電商秒殺課程發(fā)布

        ??????

        ??長按上方微信二維碼 2 秒





        感謝點(diǎn)贊支持下哈 

        瀏覽 64
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            亚洲欧美日韩激情 | 日韩毛片在线观看不卡AV | 亚洲AV成人无码www在线观看 | 日韩精品黄| 美女爱操逼 | 亚洲色图日韩在线 | 色湿淫 | 久久婷婷一级婬片A片AAA野外 | 亚洲高清无码视频在线观看 | 成人无码区免费视频网站入口 |