Spring源碼學習(六)AbstractApplicationContext.refresh()


 

加油 加油 🦆  小菜🦆🦆   

 

大致過程

 1     @Override
 2     public void refresh() throws BeansException, IllegalStateException {
 3         synchronized (this.startupShutdownMonitor) {
 4             // Prepare this context for refreshing.
 5             // 准備刷新的上下文環境
 6             prepareRefresh();
 7 
 8             // Tell the subclass to refresh the internal bean factory.
 9             //並讀取XML,解析注冊beanDefination,初始化beanFactory
10             //
11             ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
12 
13             // Prepare the bean factory for use in this context.
14             //對beanFactory進行功能填充
15             prepareBeanFactory(beanFactory);
16 
17             try {
18                 // Allows post-processing of the bean factory in context subclasses.
19                 //
20                 postProcessBeanFactory(beanFactory);
21 
22                 // Invoke factory processors registered as beans in the context.
23                 // 激活各種beanFactory的處理器
24                 invokeBeanFactoryPostProcessors(beanFactory);
25 
26                 // Register bean processors that intercept bean creation.
27                 // 注冊bean創建的Bean處理器(僅注冊)
28                 registerBeanPostProcessors(beanFactory);
29 
30                 // Initialize message source for this context.
31                 //為上下文初始化message,即不同語言的消息體,國際化處理
32                 initMessageSource();
33 
34                 // Initialize event multicaster for this context.
35                 // 初始化應用消息廣播器,
36                 initApplicationEventMulticaster();
37 
38                 // Initialize other special beans in specific context subclasses.
39                 // 留給子類擴展
40                 onRefresh();
41 
42                 // Check for listener beans and register them.
43                 // 在所有注冊的bean中查找Listener bean,注冊到消息廣播器中
44                 registerListeners();
45 
46                 // Instantiate all remaining (non-lazy-init) singletons.
47                 // 初始化剩下的單實例
48                 finishBeanFactoryInitialization(beanFactory);
49 
50                 // Last step: publish corresponding event.
51                 // 通知生命周期處理器刷新過程,同時發出ContextRefreshedEvent
52                 finishRefresh();
53             }
54 
55             catch (BeansException ex) {
56                 if (logger.isWarnEnabled()) {
57                     logger.warn("Exception encountered during context initialization - " +
58                             "cancelling refresh attempt: " + ex);
59                 }
60 
61                 // Destroy already created singletons to avoid dangling resources.
62                 destroyBeans();
63 
64                 // Reset 'active' flag.
65                 cancelRefresh(ex);
66 
67                 // Propagate exception to caller.
68                 throw ex;
69             }
70 
71             finally {
72                 // Reset common introspection caches in Spring's core, since we
73                 // might not ever need metadata for singleton beans anymore...
74                 resetCommonCaches();
75             }
76         }
77     }

 

 

 

 

 

 

 

 

 

(一)環境准備

 1     protected void prepareRefresh() {
 2         // Switch to active.
 3         this.startupDate = System.currentTimeMillis();
 4         this.closed.set(false);
 5         this.active.set(true);
 6 
 7         if (logger.isDebugEnabled()) {
 8             if (logger.isTraceEnabled()) {
 9                 logger.trace("Refreshing " + this);
10             }
11             else {
12                 logger.debug("Refreshing " + getDisplayName());
13             }
14         }
15 
16         // Initialize any placeholder property sources in the context environment.
17         // 空方法 留給子類擴展使用
18         // 繼承ClassPathXmlApplicationContext重寫initPropertySources()方法即可添加定制化驗證
19         initPropertySources();
20 
21         // Validate that all properties marked as required are resolvable:
22         // see ConfigurablePropertyResolver#setRequiredProperties
23         //檢驗屬性的合法
24         getEnvironment().validateRequiredProperties();
25 
26         // Store pre-refresh ApplicationListeners...
27         if (this.earlyApplicationListeners == null) {
28             this.earlyApplicationListeners = new LinkedHashSet<>(this.applicationListeners);
29         }
30         else {
31             // Reset local application listeners to pre-refresh state.
32             this.applicationListeners.clear();
33             this.applicationListeners.addAll(this.earlyApplicationListeners);
34         }
35 
36         // Allow for the collection of early ApplicationEvents,
37         // to be published once the multicaster is available...
38         this.earlyApplicationEvents = new LinkedHashSet<>();
39     }
(1)留給子類擴展接口
(2)驗證屬性合法性
(3)記錄容器中的早期事件
(二)加載beanFactory
1     protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
2  refreshBeanFactory();
3         return getBeanFactory();
4     }
 1     @Override
 2     protected final void refreshBeanFactory() throws BeansException {
 3         if (hasBeanFactory()) {
 4             destroyBeans();
 5             closeBeanFactory();
 6         }
 7         try {
 8             //(1)為上下文創建DefaultListableBeanFactory,並設置序列化id
 9             DefaultListableBeanFactory beanFactory = createBeanFactory();
10             beanFactory.setSerializationId(getId());
11             //(2)customizeBeanFactory()配置覆蓋方法,循環依賴,子類可覆蓋,是一個擴展接口,同樣繼承ClassPathXmlApplicationContext重寫此方法即可
12             customizeBeanFactory(beanFactory); // 配置覆蓋方法,循環依賴,子類可覆蓋
13             loadBeanDefinitions(beanFactory);// (1)創建XmlBeanDefinitionReader,(2)initBeanDefinitionReader()可擴展接口(3)loadBeanDefinitions:解析xml為beanDefinition
14             synchronized (this.beanFactoryMonitor) {
15                 this.beanFactory = beanFactory;
16             }
17         }
18         catch (IOException ex) {
19             throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
20         }
21     }

   最重要的就是解析beanDefinition,注冊到beanDefinitionMap中

(三)prepareBeanFactory()功能擴展
 1     protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
 2         // Tell the internal bean factory to use the context's class loader etc.
 3         beanFactory.setBeanClassLoader(getClassLoader());
 4         // TODO SpEl處理器如何使用
 5         beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
 6         // TODO 屬性注冊編輯器
 7         beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));
 8 
 9         // Configure the bean factory with context callbacks.
10         // 增加內置類
11         beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
12         // 設置忽略自動裝配的接口
13         beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
14         beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
15         beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
16         beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
17         beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
18         beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
19 
20         // BeanFactory interface not registered as resolvable type in a plain factory.
21         // MessageSource registered (and found for autowiring) as a bean.
22         // 設置自動裝配的特殊規則
23         beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
24         beanFactory.registerResolvableDependency(ResourceLoader.class, this);
25         beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
26         beanFactory.registerResolvableDependency(ApplicationContext.class, this);
27 
28         // Register early post-processor for detecting inner beans as ApplicationListeners.
29         beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));
30 
31         // Detect a LoadTimeWeaver and prepare for weaving, if found.
32         // 增加對AspectJ的支持
33         if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
34             beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
35             // Set a temporary ClassLoader for type matching.
36             beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
37         }
38 
39         // Register default environment beans.
40         if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
41             beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
42         }
43         if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
44             beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
45         }
46         if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
47             beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
48         }
49     }

(四)postProcessBeanFactory()是一個可擴展接口

(五)invokeBeanFactoryPostProcessors

 

 1     protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
 2         PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
 3 
 4         // Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime
 5         // (e.g. through an @Bean method registered by ConfigurationClassPostProcessor)
 6         if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
 7             beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
 8             beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
 9         }
10     }
  1     public static void invokeBeanFactoryPostProcessors(
  2             ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
  3 
  4         // Invoke BeanDefinitionRegistryPostProcessors first, if any.
  5         Set<String> processedBeans = new HashSet<>();
  6 
  7         if (beanFactory instanceof BeanDefinitionRegistry) {
  8             BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
  9             List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
 10             List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
 11 
 12             // (1)beanFactory是BeanDefinitionRegistry類型,postProcessor是BeanDefinitionRegistryPostProcessor類型
 13             //       postProcessor轉化為BeanDefinitionRegistryPostProcessor類型添加進 registryProcessors
 14             // (2)beanFactory是BeanDefinitionRegistry類型,但postProcessor不是BeanDefinitionRegistryPostProcessor類型
 15             //      postProcessor添加進 regularPostProcessors
 16             for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
 17                 if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
 18                     BeanDefinitionRegistryPostProcessor registryProcessor = (BeanDefinitionRegistryPostProcessor) postProcessor;
 19                     //TODO 調用了?
 20                     registryProcessor.postProcessBeanDefinitionRegistry(registry);
 21 
 22                     registryProcessors.add(registryProcessor);
 23                 } else {
 24                     regularPostProcessors.add(postProcessor);
 25                 }
 26             }
 27 
 28             // Do not initialize FactoryBeans here: We need to leave all regular beans
 29             // uninitialized to let the bean factory post-processors apply to them!
 30             // Separate between BeanDefinitionRegistryPostProcessors that implement
 31             // PriorityOrdered, Ordered, and the rest.
 32             List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();
 33 
 34             // First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
 35             // BeanDefinitionRegistryPostProcessors+PriorityOrdered→invokeBeanDefinitionRegistryPostProcessors()
 36             String[] postProcessorNames =beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
 37             for (String ppName : postProcessorNames) {
 38                 if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
 39                     currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
 40                     processedBeans.add(ppName);
 41                 }
 42             }
 43             sortPostProcessors(currentRegistryProcessors, beanFactory);
 44             registryProcessors.addAll(currentRegistryProcessors);
 45             invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
 46             currentRegistryProcessors.clear();
 47 
 48             // Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.
 49             // BeanDefinitionRegistryPostProcessors+Ordered→invokeBeanDefinitionRegistryPostProcessors()
 50             postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
 51             for (String ppName : postProcessorNames) {
 52                 if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
 53                     currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
 54                     processedBeans.add(ppName);
 55                 }
 56             }
 57             sortPostProcessors(currentRegistryProcessors, beanFactory);
 58             registryProcessors.addAll(currentRegistryProcessors);
 59             invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
 60             currentRegistryProcessors.clear();
 61 
 62             // Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
 63             // BeanDefinitionRegistryPostProcessors→invokeBeanDefinitionRegistryPostProcessors()
 64             boolean reiterate = true;
 65             while (reiterate) {
 66                 reiterate = false;
 67                 postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
 68                 for (String ppName : postProcessorNames) {
 69                     // 避免重復加載
 70                     if (!processedBeans.contains(ppName)) {
 71                         currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
 72                         processedBeans.add(ppName);
 73                         reiterate = true;
 74                     }
 75                 }
 76                 sortPostProcessors(currentRegistryProcessors, beanFactory);
 77                 registryProcessors.addAll(currentRegistryProcessors);
 78                 invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
 79                 currentRegistryProcessors.clear();
 80             }
 81 
 82             // Now, invoke the postProcessBeanFactory callback of all processors handled so far.
 83            // BeanDefinitionRegistryPostProcessor
 84             invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
 85             // BeanFactoryPostProcessor
 86             invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
 87         } else {
 88             // Invoke factory processors registered with the context instance.
 89             invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
 90         }
 91 
 92         // Do not initialize FactoryBeans here: We need to leave all regular beans
 93         // uninitialized to let the bean factory post-processors apply to them!
 94         String[] postProcessorNames =beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
 95 
 96         // Separate between BeanFactoryPostProcessors that implement PriorityOrdered,
 97         // Ordered, and the rest.
 98         List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
 99         List<String> orderedPostProcessorNames = new ArrayList<>();
100         List<String> nonOrderedPostProcessorNames = new ArrayList<>();
101         for (String ppName : postProcessorNames) {
102             if (processedBeans.contains(ppName)) {
103                 // 避免重復加載
104                 // skip - already processed in first phase above
105             } else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
106                 priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
107             } else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
108                 orderedPostProcessorNames.add(ppName);
109             } else {
110                 nonOrderedPostProcessorNames.add(ppName);
111             }
112         }
113 
114         // First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.
115         // BeanFactoryPostProcessor+PriorityOrdered→invokeBeanFactoryPostProcessors()
116         sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
117         invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
118 
119         // Next, invoke the BeanFactoryPostProcessors that implement Ordered.
120         //BeanFactoryPostProcessor+Ordered→invokeBeanFactoryPostProcessors()
121         List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>();
122         for (String postProcessorName : orderedPostProcessorNames) {
123             orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
124         }
125         sortPostProcessors(orderedPostProcessors, beanFactory);
126         invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
127 
128         // Finally, invoke all other BeanFactoryPostProcessors.
129         //BeanFactoryPostProcessors→invokeBeanFactoryPostProcessors()
130         List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
131         for (String postProcessorName : nonOrderedPostProcessorNames) {
132             nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
133         }
134         invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
135 
136         // Clear cached merged bean definitions since the post-processors might have
137         // modified the original metadata, e.g. replacing placeholders in values...
138         beanFactory.clearMetadataCache();
139     }
(1)了解BeanDefinitionRegistryPostProcessor 實現了 BeanFactoryPostProcessor
1 public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {
2 
3     void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;
(2)了解BeanFactoryPostProcessor
1 public interface BeanFactoryPostProcessor {
2 
3    void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
4 
5 }

(3)了解PriorityOrdered實現Ordered

 

1 public interface PriorityOrdered extends Ordered {
2 }

(4)了解Ordered

 1 public interface Ordered {
 2 
 3     /**
 4      * Useful constant for the highest precedence value.
 5      * @see java.lang.Integer#MIN_VALUE
 6      */
 7     int HIGHEST_PRECEDENCE = Integer.MIN_VALUE;
 8 
 9     /**
10      * Useful constant for the lowest precedence value.
11      * @see java.lang.Integer#MAX_VALUE
12      */
13     int LOWEST_PRECEDENCE = Integer.MAX_VALUE;
14 
15 
16     int getOrder();
17 
18 }

加載優先級:

(a)BeanDefinitionRegistryPostProcessor優先於BeanFactoryPostProcessor
(b)PriorityOrdered優先於Ordered,其中order值越小越先加載

(六)注冊
BeanPostProcessor
1     protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
2         PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);
3     }
 
        
 1 public static void registerBeanPostProcessors(
 2             ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
 3 
 4         String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
 5 
 6         // Register BeanPostProcessorChecker that logs an info message when
 7         // a bean is created during BeanPostProcessor instantiation, i.e. when
 8         // a bean is not eligible for getting processed by all BeanPostProcessors.
 9         //當后置處理器還沒有注冊就已經開始bean初始化時打印出BeanPostProcessorChecker的信息
10         int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
11         beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
12 
13         // Separate between BeanPostProcessors that implement PriorityOrdered,
14         // Ordered, and the rest.
15         //根據是否繼承PriorityOrdered,Ordered, and the rest分類
16         List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
17         List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
18         List<String> orderedPostProcessorNames = new ArrayList<>();
19         List<String> nonOrderedPostProcessorNames = new ArrayList<>();
20         for (String ppName : postProcessorNames) {
21             if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
22                 BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
23                 priorityOrderedPostProcessors.add(pp);
24                 if (pp instanceof MergedBeanDefinitionPostProcessor) {
25                     internalPostProcessors.add(pp);
26                 }
27             } else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
28                 orderedPostProcessorNames.add(ppName);
29             } else {
30                 nonOrderedPostProcessorNames.add(ppName);
31             }
32         }
33 
34         // First, register the BeanPostProcessors that implement PriorityOrdered.
35         sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
36         // 注冊實現PriorityOrdered.的
37         registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
38 
39         // Next, register the BeanPostProcessors that implement Ordered.
40         List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>();
41         for (String ppName : orderedPostProcessorNames) {
42             BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
43             orderedPostProcessors.add(pp);
44             if (pp instanceof MergedBeanDefinitionPostProcessor) {
45                 internalPostProcessors.add(pp);
46             }
47         }
48         //排序
49         sortPostProcessors(orderedPostProcessors, beanFactory);
50         //注冊實現 Ordered 的
51         registerBeanPostProcessors(beanFactory, orderedPostProcessors);
52 
53         // Now, register all regular BeanPostProcessors.
54         List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
55         for (String ppName : nonOrderedPostProcessorNames) {
56             BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
57             nonOrderedPostProcessors.add(pp);
58             if (pp instanceof MergedBeanDefinitionPostProcessor) {
59                 internalPostProcessors.add(pp);
60             }
61         }
62         // 注冊實現沒有實現PriorityOrderedOrdered和的
63         registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
64 
65         // Finally, re-register all internal BeanPostProcessors.
66         sortPostProcessors(internalPostProcessors, beanFactory);
67         // 注冊所有MergedBeanDefinitionPostProcessor類型的PostProcessors
68         registerBeanPostProcessors(beanFactory, internalPostProcessors);
69 
70         // Re-register post-processor for detecting inner beans as ApplicationListeners,
71         // moving it to the end of the processor chain (for picking up proxies etc).
72         // 注冊ApplicationListenerDetector
73         beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
74     }

 

 1     @Override
 2     public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) {
 3         Assert.notNull(beanPostProcessor, "BeanPostProcessor must not be null");
 4         // Remove from old position, if any
 5         this.beanPostProcessors.remove(beanPostProcessor);  6         // Track whether it is instantiation/destruction aware
 7         if (beanPostProcessor instanceof InstantiationAwareBeanPostProcessor) {
 8             this.hasInstantiationAwareBeanPostProcessors = true;
 9         }
10         if (beanPostProcessor instanceof DestructionAwareBeanPostProcessor) {
11             this.hasDestructionAwareBeanPostProcessors = true;
12         }
13         // 先刪后增 保證是唯一最新
14         // Add to end of list
15         this.beanPostProcessors.add(beanPostProcessor); 16     }

(1) 順序:BeanPostProcessorChecker>PriorityOrdered>Ordered>無序>MergedBeanDefinitionPostProcessor類型>ApplicationListenerDetector

(2) addBeanPostProcessor 先刪后增 保證是唯一最新

(七) 初始化消息資源

 1     protected void initMessageSource() {
 2         ConfigurableListableBeanFactory beanFactory = getBeanFactory();
 3         // bean id = messageSource
 4         if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
 5             this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);
 6             // Make MessageSource aware of parent MessageSource.
 7             if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {
 8                 HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;
 9                 if (hms.getParentMessageSource() == null) {
10                     // Only set parent context as parent MessageSource if no parent MessageSource
11                     // registered already.
12                     hms.setParentMessageSource(getInternalParentMessageSource());
13                 }
14             }
15             if (logger.isTraceEnabled()) {
16                 logger.trace("Using MessageSource [" + this.messageSource + "]");
17             }
18         }
19         else {
20             // Use empty MessageSource to be able to accept getMessage calls.
21             DelegatingMessageSource dms = new DelegatingMessageSource();
22             dms.setParentMessageSource(getInternalParentMessageSource());
23             this.messageSource = dms;
24             beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
25             if (logger.isTraceEnabled()) {
26                 logger.trace("No '" + MESSAGE_SOURCE_BEAN_NAME + "' bean, using [" + this.messageSource + "]");
27             }
28         }
29     }

 (1)具體用法

https://www.cnblogs.com/VVII/p/12170717.html

 

(八)初始化ApplicationEventMulticaster

 1     protected void initApplicationEventMulticaster() {
 2         ConfigurableListableBeanFactory beanFactory = getBeanFactory();
 3         if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
 4             this.applicationEventMulticaster =
 5                     beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
 6             if (logger.isTraceEnabled()) {
 7                 logger.trace("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");
 8             }
 9         }
10         else {
11             this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
12             beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
13             if (logger.isTraceEnabled()) {
14                 logger.trace("No '" + APPLICATION_EVENT_MULTICASTER_BEAN_NAME + "' bean, using " +
15                         "[" + this.applicationEventMulticaster.getClass().getSimpleName() + "]");
16             }
17         }
18     }

(1)有自定義事件廣播器,使用自定義事件廣播器

(2)沒有自定義事件廣播器,使用默認的SimpleApplicationEventMulticaster

 

(九)子類擴展接口onRefresh()

 

(十)注冊監聽器

 1     protected void registerListeners() {
 2         // Register statically specified listeners first.
 3         // 硬編碼指定的監聽器 TODO HOW
 4         for (ApplicationListener<?> listener : getApplicationListeners()) {
 5             getApplicationEventMulticaster().addApplicationListener(listener);
 6         }
 7 
 8         // Do not initialize FactoryBeans here: We need to leave all regular beans
 9         // uninitialized to let post-processors apply to them!
10         // bean文件注冊的監聽器
11         String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
12         for (String listenerBeanName : listenerBeanNames) {
13             getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
14         }
15 
16         // Publish early application events now that we finally have a multicaster...
17         // 早期事件
18         Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;
19         this.earlyApplicationEvents = null;
20         if (earlyEventsToProcess != null) {
21             for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
22                 getApplicationEventMulticaster().multicastEvent(earlyEvent);
23             }
24         }
25     }

(1)配置文件注冊監聽器用法

 1 public class MyEvent extends ApplicationEvent {
 2     String msg;
 3 
 4     public MyEvent(Object source,String msg) {
 5         super(source);
 6         this.msg = msg;
 7     }
 8 
 9     public void println() {
10         System.out.println(msg);
11     }
12 }
MyEvent
1 public class MyListenerTest implements ApplicationListener {
2     @Override
3     public void onApplicationEvent(ApplicationEvent event) {
4         if (event instanceof MyEvent) {
5             MyEvent myEvent = (MyEvent) event;
6             myEvent.println();
7         }
8     }
9 }
MyListenerTest
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 5 
 6     
 7     <bean class="vi.com.bean.listener.MyListenerTest"></bean>
 8 
 9 
10 </beans>
config.xml
1     @Test
2     public void test() {
3         String path = "config.xml";
4         ApplicationContext ctx = new MyClassPathXMLApplicationContext(path);
5         MyEvent myEvent = new MyEvent("","初見Spring");
6         ctx.publishEvent(myEvent);
7     }
Test

運行結果:

 初見Spring

 

(十一)初始化非延遲加載單例

 1     protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
 2         // Initialize conversion service for this context.
 3         if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&
 4                 beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {
 5             beanFactory.setConversionService(
 6                     beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));
 7         }
 8 
 9         // Register a default embedded value resolver if no bean post-processor
10         // (such as a PropertyPlaceholderConfigurer bean) registered any before:
11         // at this point, primarily for resolution in annotation attribute values.
12         if (!beanFactory.hasEmbeddedValueResolver()) {
13             beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));
14         }
15 
16         // Initialize LoadTimeWeaverAware beans early to allow for registering their transformers early.
17         String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
18         for (String weaverAwareName : weaverAwareNames) {
19             getBean(weaverAwareName);
20         }
21 
22         // Stop using the temporary ClassLoader for type matching.
23         beanFactory.setTempClassLoader(null);
24 
25         // Allow for caching all bean definition metadata, not expecting further changes.
26         beanFactory.freezeConfiguration();
27 
28         // Instantiate all remaining (non-lazy-init) singletons.
29         beanFactory.preInstantiateSingletons();
30     }
 1     public void preInstantiateSingletons() throws BeansException {
 2         if (logger.isTraceEnabled()) {
 3             logger.trace("Pre-instantiating singletons in " + this);
 4         }
 5 
 6         // Iterate over a copy to allow for init methods which in turn register new bean definitions.
 7         // While this may not be part of the regular factory bootstrap, it does otherwise work fine.
 8         List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
 9 
10         //觸發所有非惰性單例bean的初始化
11         // Trigger initialization of all non-lazy singleton beans...
12         for (String beanName : beanNames) {
13             RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
14             if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
15                 if (isFactoryBean(beanName)) {
16                     Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
17                     if (bean instanceof FactoryBean) {
18                         final FactoryBean<?> factory = (FactoryBean<?>) bean;
19                         boolean isEagerInit;
20                         if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
21                             isEagerInit = AccessController.doPrivileged((PrivilegedAction<Boolean>)
22                                             ((SmartFactoryBean<?>) factory)::isEagerInit,
23                                     getAccessControlContext());
24                         }
25                         else {
26                             isEagerInit = (factory instanceof SmartFactoryBean &&
27                                     ((SmartFactoryBean<?>) factory).isEagerInit());
28                         }
29                         if (isEagerInit) {
30                             getBean(beanName);
31                         }
32                     }
33                 }
34                 else {
35  getBean(beanName); 36                 }
37             }
38         }
39 
40         // Trigger post-initialization callback for all applicable beans...
41         for (String beanName : beanNames) {
42             Object singletonInstance = getSingleton(beanName);
43             // 是否實現SmartInitializingSingleton中的接口afterSingletonsInstantiated
44             if (singletonInstance instanceof SmartInitializingSingleton) {
45                 final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
46                 if (System.getSecurityManager() != null) {
47                     AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
48                         smartSingleton.afterSingletonsInstantiated();
49                         return null;
50                     }, getAccessControlContext());
51                 }
52                 else {
53                     smartSingleton.afterSingletonsInstantiated();
54                 }
55             }
56         }
57     }

TODO:

(十二)finishRefresh()

 1     protected void finishRefresh() {
 2         // Clear context-level resource caches (such as ASM metadata from scanning).
 3         clearResourceCaches();
 4 
 5         // Initialize lifecycle processor for this context.
 6         initLifecycleProcessor();
 7 
 8         // Propagate refresh to lifecycle processor first.
 9         getLifecycleProcessor().onRefresh();
10 
11         // Publish the final event.
12         publishEvent(new ContextRefreshedEvent(this));
13 
14         // Participate in LiveBeansView MBean, if active.
15         LiveBeansView.registerApplicationContext(this);
16     }

 

 

 

 

 

 

 

 

 

 
        





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM