1.整體啓動流程
Spring的啓動流程可以歸納爲三個步驟:
- 1、初始化Spring容器,註冊內置的BeanPostProcessor的BeanDefinition到容器中
- 2、將配置類的BeanDefinition註冊到容器中
- 3、調用refresh()方法刷新容器
因爲是基於 java-config 技術分析源碼,所以這裏的入口是 AnnotationConfigApplicationContext ,如果是使用 xml 分析,那麼入口即爲 ClassPathXmlApplicationContext ,它們倆的共同特徵便是都繼承了 AbstractApplicationContext 類,而大名鼎鼎的 refresh()便是在這個類中定義的。我們接着分析 AnnotationConfigApplicationContext 類,源碼如下:
// 初始化容器 public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) { // 註冊 Spring 內置後置處理器的 BeanDefinition 到容器 this(); // 註冊配置類 BeanDefinition 到容器 register(annotatedClasses); // 加載或者刷新容器中的Bean refresh(); }
所以整個Spring容器的啓動流程可以繪製成如下流程圖:
2.詳細拆解三個入口
一、初始化流程:
1、spring容器的初始化時,通過this()調用了無參構造函數,主要做了以下三個事情:
(1)實例化BeanFactory【DefaultListableBeanFactory】工廠,用於生成Bean對象
(2)實例化BeanDefinitionReader註解配置讀取器,用於對特定註解(如@Service、@Repository)的類進行讀取轉化成 BeanDefinition 對象,(BeanDefinition 是 Spring 中極其重要的一個概念,它存儲了 bean 對象的所有特徵信息,如是否單例,是否懶加載,factoryBeanName 等)
(3)實例化ClassPathBeanDefinitionScanner路徑掃描器,用於對指定的包目錄進行掃描查找 bean 對象
2、核心代碼剖析:
(1)向容器添加內置組件:org.springframework.context.annotation.AnnotationConfigUtils#registerAnnotationConfigProcessors:
根據上圖分析,代碼運行到這裏時候,Spring 容器已經構造完畢,那麼就可以爲容器添加一些內置組件了,其中最主要的組件便是 ConfigurationClassPostProcessor 和 AutowiredAnnotationBeanPostProcessor ,前者是一個 beanFactory 後置處理器,用來完成 bean 的掃描與注入工作,後者是一個 bean 後置處理器,用來完成 @AutoWired 自動注入。
二、註冊SpringConfig配置類到容器中:
1、將SpringConfig註冊到容器中:org.springframework.context.annotation.AnnotatedBeanDefinitionReader#doRegisterBean:
這個步驟主要是用來解析用戶傳入的 Spring 配置類,解析成一個 BeanDefinition 然後註冊到容器中,主要源碼如下:
<T> void doRegisterBean(Class<T> annotatedClass, @Nullable Supplier<T> instanceSupplier, @Nullable String name, @Nullable Class<? extends Annotation>[] qualifiers, BeanDefinitionCustomizer... definitionCustomizers) { // 解析傳入的配置類,實際上這個方法既可以解析配置類,也可以解析 Spring bean 對象 AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(annotatedClass); // 判斷是否需要跳過,判斷依據是此類上有沒有 @Conditional 註解 if (this.conditionEvaluator.shouldSkip(abd.getMetadata())) { return; } abd.setInstanceSupplier(instanceSupplier); ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(abd); abd.setScope(scopeMetadata.getScopeName()); String beanName = (name != null ? name : this.beanNameGenerator.generateBeanName(abd, this.registry)); // 處理類上的通用註解 AnnotationConfigUtils.processCommonDefinitionAnnotations(abd); if (qualifiers != null) { for (Class<? extends Annotation> qualifier : qualifiers) { if (Primary.class == qualifier) { abd.setPrimary(true); } else if (Lazy.class == qualifier) { abd.setLazyInit(true); } else { abd.addQualifier(new AutowireCandidateQualifier(qualifier)); } } } // 封裝成一個 BeanDefinitionHolder for (BeanDefinitionCustomizer customizer : definitionCustomizers) { customizer.customize(abd); } BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName); // 處理 scopedProxyMode definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry); // 把 BeanDefinitionHolder 註冊到 registry BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry); }
三、refresh()容器刷新流程:
refresh()主要用於容器的刷新,Spring 中的每一個容器都會調用 refresh() 方法進行刷新,無論是 Spring 的父子容器,還是 Spring Cloud Feign 中的 feign 隔離容器,每一個容器都會調用這個方法完成初始化。refresh()可劃分爲12個步驟,其中比較重要的步驟下面會有詳細說明。
1、refresh()方法的源碼:org.springframework.context.support.AbstractApplicationContext#refresh:
public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // ================= 一、上下文的初始化 ================= // 1.準備上下文(刷新前的預處理) prepareRefresh(); // 2.通知子類刷新內部工廠( 獲取 beanFactory,即前面創建的【DefaultListableBeanFactory】) ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); // 3.準備bean工廠以便在當前上下文中使用(預處理 beanFactory,向容器中添加一些組件) prepareBeanFactory(beanFactory); try { // ================= 二、BeanFactory的初始化 ================= // 4.對工廠進行默認後置處理(子類通過重寫這個方法可以在 BeanFactory 創建並與準備完成以後做進一步的設置) postProcessBeanFactory(beanFactory); // 5.使用後置處理器對工廠進行處理(執行 BeanFactoryPostProcessor 方法,beanFactory 後置處理器) invokeBeanFactoryPostProcessors(beanFactory); // 6.註冊Bean後置處理器(註冊 BeanPostProcessors,bean 後置處理器) registerBeanPostProcessors(beanFactory); // ================= 三、事件,Bean及其他配置的初始化 ================= // 7.初始化此上下文的消息源( 初始化 MessageSource 組件(做國際化功能;消息綁定,消息解析)) initMessageSource(); // 8.爲此上下文初始化事件廣播者(初始化事件派發器,在註冊監聽器時會用到) initApplicationEventMulticaster(); // 9.初始化特定上下文子類中的其他特殊bean(留給子容器(子類),子類重寫這個方法,在容器刷新的時候可以自定義邏輯,web 場景下會使用) onRefresh(); // 10.檢查偵聽器bean並註冊(註冊監聽器,派發之前步驟產生的一些事件(可能沒有)) registerListeners(); // 11.實例化所有非懶加載的剩餘單例(初始化所有的非單實例 bean) finishBeanFactoryInitialization(beanFactory); // 12.完成刷新(發佈容器刷新完成事件) finishRefresh(); } // ================= 異常處理 ================= catch (BeansException ex) { if (logger.isWarnEnabled()) { logger.warn("Exception encountered during context initialization - " + "cancelling refresh attempt: " + ex); } // 銷燬已創建的單例 destroyBeans(); // 重置上下文的激活狀態 cancelRefresh(ex); throw ex; } finally { // 重置內部的一些元數據緩存 resetCommonCaches(); } } }
首先我們總結一下refresh()方法每一步主要的功能:之後再對每一步的源碼做具體的分析
1、prepareRefresh()刷新前的預處理: (1)initPropertySources():初始化一些屬性設置,子類自定義個性化的屬性設置方法; (2)getEnvironment().validateRequiredProperties():檢驗屬性的合法性 (3)earlyApplicationEvents = new LinkedHashSet<ApplicationEvent>():保存容器中的一些早期的事件; 2、obtainFreshBeanFactory():獲取在容器初始化時創建的BeanFactory: (1)refreshBeanFactory():刷新BeanFactory,設置序列化ID; (2)getBeanFactory():返回初始化中的GenericApplicationContext創建的BeanFactory對象,即【DefaultListableBeanFactory】類型 3、prepareBeanFactory(beanFactory):BeanFactory的預處理工作,向容器中添加一些組件: (1)設置BeanFactory的類加載器、設置表達式解析器等等 (2)添加BeanPostProcessor【ApplicationContextAwareProcessor】 (3)設置忽略自動裝配的接口:EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware、ApplicationContextAware; (4)註冊可以解析的自動裝配類,即可以在任意組件中通過註解自動注入:BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext (5)添加BeanPostProcessor【ApplicationListenerDetector】 (6)添加編譯時的AspectJ; (7)給BeanFactory中註冊的3個組件:environment【ConfigurableEnvironment】、systemProperties【Map<String, Object>】、systemEnvironment【Map<String, Object>】 4、postProcessBeanFactory(beanFactory):子類重寫該方法,可以實現在BeanFactory創建並預處理完成以後做進一步的設置 5、invokeBeanFactoryPostProcessors(beanFactory):在BeanFactory標準初始化之後執行BeanFactoryPostProcessor的方法,即BeanFactory的後置處理器: (1)先執行BeanDefinitionRegistryPostProcessor: postProcessor.postProcessBeanDefinitionRegistry(registry) ① 獲取所有的實現了BeanDefinitionRegistryPostProcessor接口類型的集合 ② 先執行實現了PriorityOrdered優先級接口的BeanDefinitionRegistryPostProcessor ③ 再執行實現了Ordered順序接口的BeanDefinitionRegistryPostProcessor ④ 最後執行沒有實現任何優先級或者是順序接口的BeanDefinitionRegistryPostProcessors (2)再執行BeanFactoryPostProcessor的方法:postProcessor.postProcessBeanFactory(beanFactory) ① 獲取所有的實現了BeanFactoryPostProcessor接口類型的集合 ② 先執行實現了PriorityOrdered優先級接口的BeanFactoryPostProcessor ③ 再執行實現了Ordered順序接口的BeanFactoryPostProcessor ④ 最後執行沒有實現任何優先級或者是順序接口的BeanFactoryPostProcessor 6、registerBeanPostProcessors(beanFactory):向容器中註冊Bean的後置處理器BeanPostProcessor,它的主要作用是干預Spring初始化bean的流程,從而完成代理、自動注入、循環依賴等功能 (1)獲取所有實現了BeanPostProcessor接口類型的集合: (2)先註冊實現了PriorityOrdered優先級接口的BeanPostProcessor; (3)再註冊實現了Ordered優先級接口的BeanPostProcessor; (4)最後註冊沒有實現任何優先級接口的BeanPostProcessor; (5)最r終註冊MergedBeanDefinitionPostProcessor類型的BeanPostProcessor:beanFactory.addBeanPostProcessor(postProcessor); (6)給容器註冊一個ApplicationListenerDetector:用於在Bean創建完成後檢查是否是ApplicationListener,如果是,就把Bean放到容器中保存起來:applicationContext.addApplicationListener((ApplicationListener<?>) bean); 此時容器中默認有6個默認的BeanProcessor(無任何代理模式下):【ApplicationContextAwareProcessor】、【ConfigurationClassPostProcessorsAwareBeanPostProcessor】、【PostProcessorRegistrationDelegate】、【CommonAnnotationBeanPostProcessor】、【AutowiredAnnotationBeanPostProcessor】、【ApplicationListenerDetector】 7、initMessageSource():初始化MessageSource組件,主要用於做國際化功能,消息綁定與消息解析: (1)看BeanFactory容器中是否有id爲messageSource 並且類型是MessageSource的組件:如果有,直接賦值給messageSource;如果沒有,則創建一個DelegatingMessageSource; (2)把創建好的MessageSource註冊在容器中,以後獲取國際化配置文件的值的時候,可以自動注入MessageSource; 8、initApplicationEventMulticaster():初始化事件派發器,在註冊監聽器時會用到: (1)看BeanFactory容器中是否存在自定義的ApplicationEventMulticaster:如果有,直接從容器中獲取;如果沒有,則創建一個SimpleApplicationEventMulticaster (2)將創建的ApplicationEventMulticaster添加到BeanFactory中,以後其他組件就可以直接自動注入 9、onRefresh():留給子容器、子類重寫這個方法,在容器刷新的時候可以自定義邏輯 10、registerListeners():註冊監聽器:將容器中所有的ApplicationListener註冊到事件派發器中,並派發之前步驟產生的事件: (1)從容器中拿到所有的ApplicationListener (2)將每個監聽器添加到事件派發器中:getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName); (3)派發之前步驟產生的事件applicationEvents:getApplicationEventMulticaster().multicastEvent(earlyEvent); 11、finishBeanFactoryInitialization(beanFactory):初始化所有剩下的單實例bean,核心方法是preInstantiateSingletons(),會調用getBean()方法創建對象; (1)獲取容器中的所有beanDefinitionName,依次進行初始化和創建對象 (2)獲取Bean的定義信息RootBeanDefinition,它表示自己的BeanDefinition和可能存在父類的BeanDefinition合併後的對象 (3)如果Bean滿足這三個條件:非抽象的,單實例,非懶加載,則執行單例Bean創建流程: (4)所有Bean都利用getBean()創建完成以後,檢查所有的Bean是否爲SmartInitializingSingleton接口的,如果是;就執行afterSingletonsInstantiated(); 12、finishRefresh():發佈BeanFactory容器刷新完成事件: (1)initLifecycleProcessor():初始化和生命週期有關的後置處理器:默認從容器中找是否有lifecycleProcessor的組件【LifecycleProcessor】,如果沒有,則創建一個DefaultLifecycleProcessor()加入到容器; (2)getLifecycleProcessor().onRefresh():拿到前面定義的生命週期處理器(LifecycleProcessor)回調onRefresh()方法 (3)publishEvent(new ContextRefreshedEvent(this)):發佈容器刷新完成事件; (4)liveBeansView.registerApplicationContext(this);
2、第三步:BeanFactory的預處理:org.springframework.context.support.AbstractApplicationContext#prepareBeanFactory(這一步主要爲 beanFactory 工廠添加一些內置組件):
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) { // 設置 classLoader beanFactory.setBeanClassLoader(getClassLoader()); //設置 bean 表達式解析器 beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader())); beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment())); // 添加一個 BeanPostProcessor【ApplicationContextAwareProcessor】 beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this)); // 設置忽略自動裝配的接口,即不能通過註解自動注入 beanFactory.ignoreDependencyInterface(EnvironmentAware.class); beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class); beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class); beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class); beanFactory.ignoreDependencyInterface(MessageSourceAware.class); beanFactory.ignoreDependencyInterface(ApplicationContextAware.class); // 註冊可以解析的自動裝配類,即可以在任意組件中通過註解自動注入 beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory); beanFactory.registerResolvableDependency(ResourceLoader.class, this); beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this); beanFactory.registerResolvableDependency(ApplicationContext.class, this); // 添加一個 BeanPostProcessor【ApplicationListenerDetector】 beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this)); // 添加編譯時的 AspectJ if (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())); } // 註冊 environment 組件,類型是【ConfigurableEnvironment】 if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) { beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment()); } // 註冊 systemProperties 組件,類型是【Map<String, Object>】 if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) { beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties()); } // 註冊 systemEnvironment 組件,類型是【Map<String, Object>】 if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) { beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment()); } }
執行流程小結: (1)設置BeanFactory的類加載器、設置表達式解析器等等 (2)添加BeanPostProcessor【ApplicationContextAwareProcessor】 (3)設置忽略自動裝配的接口:EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware、ApplicationContextAware; (4)註冊可以解析的自動裝配類,即可以在任意組件中通過註解自動注入:BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext (5)添加BeanPostProcessor【ApplicationListenerDetector】 (6)添加編譯時的AspectJ; (7)給BeanFactory中註冊的3個組件:environment【ConfigurableEnvironment】、systemProperties【Map<String, Object>】、systemEnvironment【Map<String, Object>】
3、第五步:執行BeanFactory的後置處理器:org.springframework.context.support.PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors:
Spring 在掃描完所有的 bean 轉成 BeanDefinition 時候,允許我們做一些自定義操作,這得益於 Spring 爲我們提供的 BeanFactoryPostProcessor 接口。
其中 BeanFactoryPostProcessor 又有一個子接口 BeanDefinitionRegistryPostProcessor ,前者會把 ConfigurableListableBeanFactory 暴露給我們使用,後者會把 BeanDefinitionRegistry 註冊器暴露給我們使用,一旦獲取到註冊器,我們就可以按需注入了。
同時 Spring 是允許我們控制同類型組件的順序,比如在 AOP 中我們常用的 @Order 註解,這裏的 BeanFactoryPostProcessor 接口當然也是提供了順序,最先被執行的是實現了 PriorityOrdered 接口的實現類,然後再到實現了 Ordered 接口的實現類,最後就是剩下來的常規 BeanFactoryPostProcessor 類。
此時再看上圖,是不是發現和喝水一般簡單,首先會回調 postProcessBeanDefinitionRegistry() 方法,然後再回調 postProcessBeanFactory() 方法,最後注意順序即可,下面一起看看具體的代碼實現吧。
public static void invokeBeanFactoryPostProcessors( ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) { // beanFactoryPostProcessors 這個參數是指用戶通過 AnnotationConfigApplicationContext.addBeanFactoryPostProcessor() 方法手動傳入的 BeanFactoryPostProcessor,沒有交給 spring 管理 // Invoke BeanDefinitionRegistryPostProcessors first, if any. // 代表執行過的 BeanDefinitionRegistryPostProcessor Set<String> processedBeans = new HashSet<>(); if (beanFactory instanceof BeanDefinitionRegistry) { BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory; // 常規後置處理器集合,即實現了 BeanFactoryPostProcessor 接口 List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>(); // 註冊後置處理器集合,即實現了 BeanDefinitionRegistryPostProcessor 接口 List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>(); // 處理自定義的 beanFactoryPostProcessors(指調用 context.addBeanFactoryPostProcessor() 方法),一般這裏都沒有 for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) { if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) { BeanDefinitionRegistryPostProcessor registryProcessor = (BeanDefinitionRegistryPostProcessor) postProcessor; // 調用 postProcessBeanDefinitionRegistry 方法 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. // 定義一個變量 currentRegistryProcessors,表示當前要處理的 BeanFactoryPostProcessors List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>(); // First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered. // 首先,從容器中查找實現了 PriorityOrdered 接口的 BeanDefinitionRegistryPostProcessor 類型,這裏只會查找出一個【ConfigurationClassPostProcessor】 String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); for (String ppName : postProcessorNames) { // 判斷是否實現了 PriorityOrdered 接口 if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { // 添加到 currentRegistryProcessors currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)); // 添加到 processedBeans,表示已經處理過這個類了 processedBeans.add(ppName); } } // 設置排列順序 sortPostProcessors(currentRegistryProcessors, beanFactory); // 添加到 registry 中 registryProcessors.addAll(currentRegistryProcessors); // 執行 [postProcessBeanDefinitionRegistry] 回調方法 invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry); // 將 currentRegistryProcessors 變量清空,下面會繼續用到 currentRegistryProcessors.clear(); // Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered. // 接下來,從容器中查找實現了 Ordered 接口的 BeanDefinitionRegistryPostProcessors 類型,這裏可能會查找出多個 // 因爲【ConfigurationClassPostProcessor】已經完成了 postProcessBeanDefinitionRegistry() 方法,已經向容器中完成掃描工作,所以容器會有很多個組件 postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); for (String ppName : postProcessorNames) { // 判斷 processedBeans 是否處理過這個類,且是否實現 Ordered 接口 if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) { currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)); processedBeans.add(ppName); } } // 設置排列順序 sortPostProcessors(currentRegistryProcessors, beanFactory); // 添加到 registry 中 registryProcessors.addAll(currentRegistryProcessors); // 執行 [postProcessBeanDefinitionRegistry] 回調方法 invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry); // 將 currentRegistryProcessors 變量清空,下面會繼續用到 currentRegistryProcessors.clear(); // Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear. // 最後,從容器中查找剩餘所有常規的 BeanDefinitionRegistryPostProcessors 類型 boolean reiterate = true; while (reiterate) { reiterate = false; // 根據類型從容器中查找 postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); for (String ppName : postProcessorNames) { // 判斷 processedBeans 是否處理過這個類 if (!processedBeans.contains(ppName)) { // 添加到 currentRegistryProcessors currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)); // 添加到 processedBeans,表示已經處理過這個類了 processedBeans.add(ppName); // 將標識設置爲 true,繼續循環查找,可能隨時因爲防止下面調用了 invokeBeanDefinitionRegistryPostProcessors() 方法引入新的後置處理器 reiterate = true; } } // 設置排列順序 sortPostProcessors(currentRegistryProcessors, beanFactory); // 添加到 registry 中 registryProcessors.addAll(currentRegistryProcessors); // 執行 [postProcessBeanDefinitionRegistry] 回調方法 invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry); // 將 currentRegistryProcessors 變量清空,因爲下一次循環可能會用到 currentRegistryProcessors.clear(); } // Now, invoke the postProcessBeanFactory callback of all processors handled so far. // 現在執行 registryProcessors 的 [postProcessBeanFactory] 回調方法 invokeBeanFactoryPostProcessors(registryProcessors, beanFactory); // 執行 regularPostProcessors 的 [postProcessBeanFactory] 回調方法,也包含用戶手動調用 addBeanFactoryPostProcessor() 方法添加的 BeanFactoryPostProcessor invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory); } else { // Invoke factory processors registered with the context instance. invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory); } // Do not initialize FactoryBeans here: We need to leave all regular beans // uninitialized to let the bean factory post-processors apply to them! // 從容器中查找實現了 BeanFactoryPostProcessor 接口的類 String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false); // Separate between BeanFactoryPostProcessors that implement PriorityOrdered, // Ordered, and the rest. // 表示實現了 PriorityOrdered 接口的 BeanFactoryPostProcessor List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>(); // 表示實現了 Ordered 接口的 BeanFactoryPostProcessor List<String> orderedPostProcessorNames = new ArrayList<>(); // 表示剩下來的常規的 BeanFactoryPostProcessors List<String> nonOrderedPostProcessorNames = new ArrayList<>(); for (String ppName : postProcessorNames) { // 判斷是否已經處理過,因爲 postProcessorNames 其實包含了上面步驟處理過的 BeanDefinitionRegistry 類型 if (processedBeans.contains(ppName)) { // skip - already processed in first phase above } // 判斷是否實現了 PriorityOrdered 接口 else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class)); } // 判斷是否實現了 Ordered 接口 else if (beanFactory.isTypeMatch(ppName, Ordered.class)) { orderedPostProcessorNames.add(ppName); } // 剩下所有常規的 else { nonOrderedPostProcessorNames.add(ppName); } } // First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered. // 先將 priorityOrderedPostProcessors 集合排序 sortPostProcessors(priorityOrderedPostProcessors, beanFactory); // 執行 priorityOrderedPostProcessors 的 [postProcessBeanFactory] 回調方法 invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory); // Next, invoke the BeanFactoryPostProcessors that implement Ordered. // 接下來,把 orderedPostProcessorNames 轉成 orderedPostProcessors 集合 List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(); for (String postProcessorName : orderedPostProcessorNames) { orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class)); } // 將 orderedPostProcessors 集合排序 sortPostProcessors(orderedPostProcessors, beanFactory); // 執行 orderedPostProcessors 的 [postProcessBeanFactory] 回調方法 invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory); // Finally, invoke all other BeanFactoryPostProcessors. // 最後把 nonOrderedPostProcessorNames 轉成 nonOrderedPostProcessors 集合,這裏只有一個,myBeanFactoryPostProcessor List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(); for (String postProcessorName : nonOrderedPostProcessorNames) { nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class)); } // 執行 nonOrderedPostProcessors 的 [postProcessBeanFactory] 回調方法 invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory); // Clear cached merged bean definitions since the post-processors might have // modified the original metadata, e.g. replacing placeholders in values... // 清除緩存 beanFactory.clearMetadataCache(); }
執行流程小結: (1)先執行BeanDefinitionRegistryPostProcessor: postProcessor.postProcessBeanDefinitionRegistry(registry) ① 獲取所有的實現了BeanDefinitionRegistryPostProcessor接口類型的集合 ② 先執行實現了PriorityOrdered優先級接口的BeanDefinitionRegistryPostProcessor ③ 再執行實現了Ordered順序接口的BeanDefinitionRegistryPostProcessor ④ 最後執行沒有實現任何優先級或者是順序接口的BeanDefinitionRegistryPostProcessors (2)再執行BeanFactoryPostProcessor的方法:postProcessor.postProcessBeanFactory(beanFactory) ① 獲取所有的實現了BeanFactoryPostProcessor接口類型的集合 ② 先執行實現了PriorityOrdered優先級接口的BeanFactoryPostProcessor ③ 再執行實現了Ordered順序接口的BeanFactoryPostProcessor ④ 最後執行沒有實現任何優先級或者是順序接口的BeanFactoryPostProcessor
4、第六步:註冊Bean的後置處理器:org.springframework.context.support.PostProcessorRegistrationDelegate#registerBeanPostProcessors:
這一步是向容器中注入 BeanPostProcessor 後置處理器,注意這裏僅僅是向容器中注入而非使用。關於 BeanPostProcessor ,它的作用主要是會干預 Spring 初始化 bean 的流程,從而完成代理、自動注入、循環依賴等各種功能。
public static void registerBeanPostProcessors( ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) { // 從容器中獲取 BeanPostProcessor 類型 String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false); // 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; // 向容器中添加【BeanPostProcessorChecker】,主要是用來檢查是不是有 bean 已經初始化完成了, // 如果沒有執行所有的 beanPostProcessor(用數量來判斷),如果有就會打印一行 info 日誌 beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount)); // Separate between BeanPostProcessors that implement PriorityOrdered, // Ordered, and the rest. // 存放實現了 PriorityOrdered 接口的 BeanPostProcessor List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>(); // 存放 MergedBeanDefinitionPostProcessor 類型的 BeanPostProcessor List<BeanPostProcessor> internalPostProcessors = new ArrayList<>(); // 存放實現了 Ordered 接口的 BeanPostProcessor 的 name List<String> orderedPostProcessorNames = new ArrayList<>(); // 存放剩下來普通的 BeanPostProcessor 的 name List<String> nonOrderedPostProcessorNames = new ArrayList<>(); // 從 beanFactory 中查找 postProcessorNames 裏的 bean,然後放到對應的集合中 for (String ppName : postProcessorNames) { // 判斷有無實現 PriorityOrdered 接口 if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); priorityOrderedPostProcessors.add(pp); // 如果實現了 PriorityOrdered 接口,且屬於 MergedBeanDefinitionPostProcessor if (pp instanceof MergedBeanDefinitionPostProcessor) { // 把 MergedBeanDefinitionPostProcessor 類型的添加到 internalPostProcessors 集合中 internalPostProcessors.add(pp); } } else if (beanFactory.isTypeMatch(ppName, Ordered.class)) { orderedPostProcessorNames.add(ppName); } else { nonOrderedPostProcessorNames.add(ppName); } } // First, register the BeanPostProcessors that implement PriorityOrdered. // 給 priorityOrderedPostProcessors 排序 sortPostProcessors(priorityOrderedPostProcessors, beanFactory); // 先註冊實現了 PriorityOrdered 接口的 beanPostProcessor registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors); // Next, register the BeanPostProcessors that implement Ordered. // 從 beanFactory 中查找 orderedPostProcessorNames 裏的 bean,然後放到對應的集合中 List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(); for (String ppName : orderedPostProcessorNames) { BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); orderedPostProcessors.add(pp); if (pp instanceof MergedBeanDefinitionPostProcessor) { internalPostProcessors.add(pp); } } // 給 orderedPostProcessors 排序 sortPostProcessors(orderedPostProcessors, beanFactory); // 再註冊實現了 Ordered 接口的 beanPostProcessor registerBeanPostProcessors(beanFactory, orderedPostProcessors); // Now, register all regular BeanPostProcessors. List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(); for (String ppName : nonOrderedPostProcessorNames) { BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); nonOrderedPostProcessors.add(pp); if (pp instanceof MergedBeanDefinitionPostProcessor) { internalPostProcessors.add(pp); } } // 再註冊常規的 beanPostProcessor registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors); // Finally, re-register all internal BeanPostProcessors. // 排序 MergedBeanDefinitionPostProcessor 這種類型的 beanPostProcessor sortPostProcessors(internalPostProcessors, beanFactory); // 最後註冊 MergedBeanDefinitionPostProcessor 類型的 beanPostProcessor registerBeanPostProcessors(beanFactory, internalPostProcessors); // Re-register post-processor for detecting inner beans as ApplicationListeners, // moving it to the end of the processor chain (for picking up proxies etc). // 給容器中添加【ApplicationListenerDetector】 beanPostProcessor,判斷是不是監聽器,如果是就把 bean 放到容器中保存起來 // 此時容器中默認會有 6 個內置的 beanPostProcessor // 0 = {ApplicationContextAwareProcessor@1632} // 1 = {ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor@1633} // 2 = {PostProcessorRegistrationDelegate$BeanPostProcessorChecker@1634} // 3 = {CommonAnnotationBeanPostProcessor@1635} // 4 = {AutowiredAnnotationBeanPostProcessor@1636} // 5 = {ApplicationListenerDetector@1637} beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext)); }
執行流程小結: (1)獲取所有實現了BeanPostProcessor接口類型的集合: (2)先註冊實現了PriorityOrdered優先級接口的BeanPostProcessor; (3)再註冊實現了Ordered優先級接口的BeanPostProcessor; (4)最後註冊沒有實現任何優先級接口的BeanPostProcessor; (5)最終註冊MergedBeanDefinitionPostProcessor類型的BeanPostProcessor; (6)給容器註冊一個ApplicationListenerDetector:用於在Bean創建完成後檢查是否是ApplicationListener,如果是,就把Bean放到容器中保存起來:applicationContext.addApplicationListener((ApplicationListener<?>) bean);
5、第八步:初始化事件派發器:org.springframework.context.support.AbstractApplicationContext#initApplicationEventMulticaster:
前文我們說到,在整個容器創建過程中,Spring 會發布很多容器事件,如容器啓動、刷新、關閉等,這個功能的實現得益於這裏的 ApplicationEventMulticaster 廣播器組件,通過它來派發事件通知。
protected void initApplicationEventMulticaster() { // 獲取 beanFactory ConfigurableListableBeanFactory beanFactory = getBeanFactory(); // 看看容器中是否有自定義的 applicationEventMulticaster 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 { // 沒有,就創建一個 SimpleApplicationEventMulticaster this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory); // 將創建的 ApplicationEventMulticaster 添加到 BeanFactory 中, 其他組件就可以自動注入了 beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster); if (logger.isTraceEnabled()) { logger.trace("No '" + APPLICATION_EVENT_MULTICASTER_BEAN_NAME + "' bean, using " + "[" + this.applicationEventMulticaster.getClass().getSimpleName() + "]"); } } }
執行流程小結: (1)看BeanFactory容器中是否存在自定義的ApplicationEventMulticaster:如果有,直接從容器中獲取;如果沒有,則創建一個SimpleApplicationEventMulticaster (2)將創建的ApplicationEventMulticaster添加到BeanFactory中,以後其他組件就可以直接自動注入
6、第十步:註冊ApplicationListener監聽器:org.springframework.context.support.AbstractApplicationContext#registerListeners:
這一步主要是將容器中所有的ApplicationListener註冊到事件派發器中,並派發之前步驟產生的事件。
protected void registerListeners() { // Register statically specified listeners first. // 獲取之前步驟中保存的 ApplicationListener for (ApplicationListener<?> listener : getApplicationListeners()) { // getApplicationEventMulticaster() 就是獲取之前步驟初始化的 applicationEventMulticaster getApplicationEventMulticaster().addApplicationListener(listener); } // Do not initialize FactoryBeans here: We need to leave all regular beans // uninitialized to let post-processors apply to them! // 從容器中獲取所有的 ApplicationListener String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false); for (String listenerBeanName : listenerBeanNames) { getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName); } // Publish early application events now that we finally have a multicaster... // 派發之前步驟產生的 application events Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents; this.earlyApplicationEvents = null; if (earlyEventsToProcess != null) { for (ApplicationEvent earlyEvent : earlyEventsToProcess) { getApplicationEventMulticaster().multicastEvent(earlyEvent); } } }
執行流程小結: (1)從容器中拿到所有的ApplicationListener (2)將每個監聽器添加到事件派發器中:getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName); (3)派發之前步驟產生的事件applicationEvents:getApplicationEventMulticaster().multicastEvent(earlyEvent);
7、第十一步:初始化所有的單例Bean:org.springframework.beans.factory.support.DefaultListableBeanFactory#preInstantiateSingletons:
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. // 獲取容器中的所有 beanDefinitionName List<String> beanNames = new ArrayList<>(this.beanDefinitionNames); // Trigger initialization of all non-lazy singleton beans... // 循環進行初始化和創建對象 for (String beanName : beanNames) { // 獲取 RootBeanDefinition,它表示自己的 BeanDefinition 和可能存在父類的 BeanDefinition 合併後的對象 RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName); // 如果是非抽象的,且單實例,非懶加載 if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) { // 如果是 factoryBean,利用下面這種方法創建對象 if (isFactoryBean(beanName)) { // 如果是 factoryBean,則 加上 &,先創建工廠 bean Object bean = getBean(FACTORY_BEAN_PREFIX + beanName); if (bean instanceof FactoryBean) { final 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 { // 不是工廠 bean,用這種方法創建對象 getBean(beanName); } } } // Trigger post-initialization callback for all applicable beans... for (String beanName : beanNames) { Object singletonInstance = getSingleton(beanName); // 檢查所有的 bean 是否是 SmartInitializingSingleton 接口 if (singletonInstance instanceof SmartInitializingSingleton) { final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance; if (System.getSecurityManager() != null) { AccessController.doPrivileged((PrivilegedAction<Object>) () -> { smartSingleton.afterSingletonsInstantiated(); return null; }, getAccessControlContext()); } else { // 回調 afterSingletonsInstantiated() 方法,可以在回調中做一些事情 smartSingleton.afterSingletonsInstantiated(); } } } }
執行流程小結: (1)獲取容器中的所有beanDefinitionName,依次進行初始化和創建對象 (2)獲取Bean的定義信息RootBeanDefinition,它表示自己的BeanDefinition和可能存在父類的BeanDefinition合併後的對象 (3)如果Bean滿足這三個條件:非抽象的,單實例,非懶加載,則執行單例Bean創建流程: (4)所有Bean都利用getBean()創建完成以後,檢查所有的Bean是否爲SmartInitializingSingleton接口的,如果是;就執行afterSingletonsInstantiated();
8、第十二步:發佈BeanFactory容器刷新完成事件:org.springframework.context.support.AbstractApplicationContext#finishRefresh:
整個容器初始化完畢之後,會在這裏進行一些掃尾工作,如清理緩存,初始化生命週期處理器,發佈容器刷新事件等。
protected void finishRefresh() { // Clear context-level resource caches (such as ASM metadata from scanning). // 清理緩存 clearResourceCaches(); // Initialize lifecycle processor for this context. // 初始化和生命週期有關的後置處理器 initLifecycleProcessor(); // Propagate refresh to lifecycle processor first. // 拿到前面定義的生命週期處理器【LifecycleProcessor】回調 onRefresh() 方法 getLifecycleProcessor().onRefresh(); // Publish the final event. // 發佈容器刷新完成事件 publishEvent(new ContextRefreshedEvent(this)); // Participate in LiveBeansView MBean, if active. LiveBeansView.registerApplicationContext(this); }
執行流程小結: (1)initLifecycleProcessor():初始化和生命週期有關的後置處理器:默認從容器中找是否有lifecycleProcessor的組件【LifecycleProcessor】,如果沒有,則創建一個DefaultLifecycleProcessor()加入到容器; (2)getLifecycleProcessor().onRefresh():拿到前面定義的生命週期處理器(LifecycleProcessor)回調onRefresh()方法 (3)publishEvent(new ContextRefreshedEvent(this)):發佈容器刷新完成事件; (4)liveBeansView.registerApplicationContext(this);
參考文檔:https://blog.csdn.net/a745233700/article/details/113761271