前言:前幾篇文章已經将BeanDefinition的加載過程大緻分析完成,接下來繼續分析其他過程。
AbstractApplicationContext#refresh
1 public void refresh() throws BeansException, IllegalStateException {
2 synchronized (this.startupShutdownMonitor) {
3 // Prepare this context for refreshing.
4 // 準備重新整理上下文環境
5 prepareRefresh();
6
7 // Tell the subclass to refresh the internal bean factory.
8 // 建立并初始化BeanFactory
9 ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
10
11 // Prepare the bean factory for use in this context.
12 // 填充BeanFactory
13 prepareBeanFactory(beanFactory);
14
15 try {
16 // Allows post-processing of the bean factory in context subclasses.
17 // 提供子類覆寫的額外處理,即子類處理定義的BeanFactoryPostProcess
18 postProcessBeanFactory(beanFactory);
19
20 // Invoke factory processors registered as beans in the context.
21 // 激活各種BeanFactory處理器
22 invokeBeanFactoryPostProcessors(beanFactory);
23
24 // Register bean processors that intercept bean creation.
25 // 注冊攔截Bean建立的Bean處理器,即注冊BeanPostProcessor
26 registerBeanPostProcessors(beanFactory);
27
28 // Initialize message source for this context.
29 // 初始化上下文中的資源檔案,如國際化檔案的處理
30 initMessageSource();
31
32 // Initialize event multicaster for this context.
33 // 初始化上下文事件廣播器
34 initApplicationEventMulticaster();
35
36 // Initialize other special beans in specific context subclasses.
37 // 給子類擴充初始化其他bean
38 onRefresh();
39
40 // Check for listener beans and register them.
41 // 在所有bean中查找listener bean,然後注冊到廣播器中
42 registerListeners();
43
44 // Instantiate all remaining (non-lazy-init) singletons.
45 // 初始化剩下的單例Bean(非延遲加載的)
46 finishBeanFactoryInitialization(beanFactory);
47
48 // Last step: publish corresponding event.
49 // 完成重新整理過程,通知聲明周期處理器lifecycleProcessor重新整理過程,同時發出ContextRefreshEvent事件通知别人
50 finishRefresh();
51 } catch (BeansException ex) {
52 if (logger.isWarnEnabled()) {
53 logger.warn("Exception encountered during context initialization - " +
54 "cancelling refresh attempt: " + ex);
55 }
56
57 // Destroy already created singletons to avoid dangling resources.
58 // 銷毀已經建立的bean
59 destroyBeans();
60
61 // Reset 'active' flag.
62 // 重置容器激活标簽
63 cancelRefresh(ex);
64
65 // Propagate exception to caller.
66 throw ex;
67 } finally {
68 // Reset common introspection caches in Spring's core, since we
69 // might not ever need metadata for singleton beans anymore...
70 resetCommonCaches();
71 }
72 }
73 }
再次回到refresh函數中,前面已經将preparRefresh和obtainFreshBeanFactory函數進行了分析,特别是obtainFreshBeanFactory引申出了非常多的内容,接下來我們看prepareBeanFactory函數。
AbstractApplicationContext#prepareBeanFactory
1 protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
2 // Tell the internal bean factory to use the context's class loader etc.
3 // 設定beanFactory的classLoader
4 beanFactory.setBeanClassLoader(getClassLoader());
5 // 設定beanFactory的表達式語言處理器,Spring3開始增加了對語言表達式,預設可以使用#{bean.xxx}的形式來調用相關屬性值
6 beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
7 // 為beanFactory增加一個預設的propertyEditor
8 beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));
9
10 // Configure the bean factory with context callbacks.
11 // 添加ApplicationContextAwareProcessor
12 beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
13 // 設定忽略自動裝配的接口
14 beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
15 beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
16 beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
17 beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
18 beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
19 beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
20
21 // BeanFactory interface not registered as resolvable type in a plain factory.
22 // MessageSource registered (and found for autowiring) as a bean.
23 // 設定幾個自動裝配的特殊規則
24 beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
25 beanFactory.registerResolvableDependency(ResourceLoader.class, this);
26 beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
27 beanFactory.registerResolvableDependency(ApplicationContext.class, this);
28
29 // Register early post-processor for detecting inner beans as ApplicationListeners.
30 beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));
31
32 // Detect a LoadTimeWeaver and prepare for weaving, if found.
33 // 增加對AspectJ的支援
34 if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
35 beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
36 // Set a temporary ClassLoader for type matching.
37 beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
38 }
39
40 // Register default environment beans.
41 // 注冊預設的系統環境bean
42 if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
43 beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
44 }
45 if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
46 beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
47 }
48 if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
49 beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
50 }
51 }
分析:
該函數的邏輯比較簡單,就是對BeanFactory的一些屬性進行填充,為後期執行個體化Bean做準備。
AbstractApplicationContext#postProcessBeanFactory該函數的預設實作為空,主要提供給子類進行自定義處理,增強擴充性。
AbstractApplicationContext#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 }
該函數的作用是激活BeanFactory的一些處理器。主要邏輯在PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors
1 public static void invokeBeanFactoryPostProcessors(
2 ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
3
4 // Invoke BeanDefinitionRegistryPostProcessors first, if any.
5 // 定義一個set儲存所有BeanFactoryPostProcessors
6 Set<String> processedBeans = new HashSet<>();
7
8 // 如果目前BeanFactory為BeanDefinitionRegistry
9 if (beanFactory instanceof BeanDefinitionRegistry) {
10 BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
11 // BeanFactoryPostProcessor集合
12 List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
13 // BeanDefinitionRegistryPostProcessor集合
14 List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
15
16 // 周遊beanFactoryPostProcessors
17 for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
18 // 如果是BeanDefinitionRegistryPostProcessor,則調用BeanDefinitionRegistryPostProcessor進行注冊
19 // 同時加入到registryProcessors集合中
20 if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
21 BeanDefinitionRegistryPostProcessor registryProcessor =
22 (BeanDefinitionRegistryPostProcessor) postProcessor;
23 registryProcessor.postProcessBeanDefinitionRegistry(registry);
24 registryProcessors.add(registryProcessor);
25 } else {
26 // 否則當做普通的BeanFactoryPostProcessor處理,添加到regularPostProcessors集合中,便于後續處理
27 regularPostProcessors.add(postProcessor);
28 }
29 }
30
31 // Do not initialize FactoryBeans here: We need to leave all regular beans
32 // uninitialized to let the bean factory post-processors apply to them!
33 // Separate between BeanDefinitionRegistryPostProcessors that implement
34 // PriorityOrdered, Ordered, and the rest.
35 // 用于儲存目前處理的BeanDefinitionRegistryPostProcessor
36 List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();
37
38 // First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
39 // 首先處理實作了PriorityOrdered(郵箱排序接口)的BeanDefinitionRegistryPostProcessor
40 String[] postProcessorNames =
41 beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
42 for (String ppName : postProcessorNames) {
43 if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
44 currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
45 processedBeans.add(ppName);
46 }
47 }
48 // 排序
49 sortPostProcessors(currentRegistryProcessors, beanFactory);
50 // 加入registryProcessors集合
51 registryProcessors.addAll(currentRegistryProcessors);
52 // 調用所有實作了PriorityOrdered的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry()
53 invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
54 // 清空,以備下次使用
55 currentRegistryProcessors.clear();
56
57 // Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.
58 // 其次,調用實作了Ordered(普通排序接口)的BeanDefinitionRegistryPostProcessor
59 // 邏輯與上面相同
60 postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
61 for (String ppName : postProcessorNames) {
62 if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
63 currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
64 processedBeans.add(ppName);
65 }
66 }
67 sortPostProcessors(currentRegistryProcessors, beanFactory);
68 registryProcessors.addAll(currentRegistryProcessors);
69 invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
70 currentRegistryProcessors.clear();
71
72 // Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
73 // 最後調用其他的BeanDefinitionRegistryPostProcessors
74 boolean reiterate = true;
75 while (reiterate) {
76 reiterate = false;
77 // 擷取BeanDefinitionRegistryPostProcessors
78 postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
79 for (String ppName : postProcessorNames) {
80 // 沒有包含在processBeans中的(因為包含的都已經處理了)
81 if (!processedBeans.contains(ppName)) {
82 currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
83 processedBeans.add(ppName);
84 reiterate = true;
85 }
86 }
87 // 同樣的邏輯
88 sortPostProcessors(currentRegistryProcessors, beanFactory);
89 registryProcessors.addAll(currentRegistryProcessors);
90 invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
91 currentRegistryProcessors.clear();
92 }
93
94 // Now, invoke the postProcessBeanFactory callback of all processors handled so far.
95 // 調用所有BeanDefinitionRegistryPostProcessor(包括手動注冊和通過配置檔案注冊)和BeanFactoryPostProcessor(隻有手動注冊)的回調函數(postProcessBeanFactory)
96 invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
97 invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
98 } else {
99 // 如果不是BeanDefinitionRegistry隻需調用其回調函數(postProcessBeanFactory())即可
100 // Invoke factory processors registered with the context instance.
101 invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
102 }
103
104 // Do not initialize FactoryBeans here: We need to leave all regular beans
105 // uninitialized to let the bean factory post-processors apply to them!
106 String[] postProcessorNames =
107 beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
108
109 // Separate between BeanFactoryPostProcessors that implement PriorityOrdered,
110 // Ordered, and the rest.
111 // 這裡同樣需要區分PriorityOrdered、Ordered和沒有排序的
112 List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
113 List<String> orderedPostProcessorNames = new ArrayList<>();
114 List<String> nonOrderedPostProcessorNames = new ArrayList<>();
115 for (String ppName : postProcessorNames) {
116 // 已經處理過,則跳過
117 if (processedBeans.contains(ppName)) {
118 // skip - already processed in first phase above
119 } else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { // PriorityOrdered
120 priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
121 } else if (beanFactory.isTypeMatch(ppName, Ordered.class)) { // Ordered
122 orderedPostProcessorNames.add(ppName);
123 } else {// 未排序的
124 nonOrderedPostProcessorNames.add(ppName);
125 }
126 }
127
128 // First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.
129 // PriorityOrdered接口
130 sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
131 invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
132
133 // Next, invoke the BeanFactoryPostProcessors that implement Ordered.
134 // Ordered接口
135 List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
136 for (String postProcessorName : orderedPostProcessorNames) {
137 orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
138 }
139 sortPostProcessors(orderedPostProcessors, beanFactory);
140 invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
141
142 // Finally, invoke all other BeanFactoryPostProcessors.
143 // 未排序的接口
144 List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
145 for (String postProcessorName : nonOrderedPostProcessorNames) {
146 nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
147 }
148 invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
149
150 // Clear cached merged bean definitions since the post-processors might have
151 // modified the original metadata, e.g. replacing placeholders in values...
152 beanFactory.clearMetadataCache();
153 }
上述代碼較長,但是處理邏輯較為單一,就是對所有的 BeanDefinitionRegistryPostProcessors 、手動注冊的 BeanFactoryPostProcessor 以及通過配置檔案方式的 BeanFactoryPostProcessor 按照PriorityOrdered 、 Ordered、nonOrdered 三種方式分開處理、調用。
PostProcessorRegistrationDelegate#registerBeanPostProcessors
1 public static void registerBeanPostProcessors(
2 ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
3
4 // 擷取所有的BeanPostProcessor的beanName
5 // 這些beanName都已經全部加載到容器中去,但是沒有執行個體化
6 String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
7
8 // Register BeanPostProcessorChecker that logs an info message when
9 // a bean is created during BeanPostProcessor instantiation, i.e. when
10 // a bean is not eligible for getting processed by all BeanPostProcessors.
11 // 記錄所有的beanProcessor數量
12 int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
13 // 注冊BeanPostProcessorChecker,它主要用于在BeanPostProcessor執行個體化期間記錄日志
14 // 當Spring中高配置的後置處理器還沒有注冊就已經開始了bean的執行個體化過程,這個時候便會列印BeanPostProcessorChecker中的内容
15 beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
16
17 // Separate between BeanPostProcessors that implement PriorityOrdered,
18 // Ordered, and the rest.
19 // priorityOrderedPostProcessors保證順序
20 List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
21 List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
22 // 使用Ordered保證順序
23 List<String> orderedPostProcessorNames = new ArrayList<>();
24 // 沒有順序
25 List<String> nonOrderedPostProcessorNames = new ArrayList<>();
26 for (String ppName : postProcessorNames) {
27 // PriorityOrdered
28 if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
29 // 調用getBean擷取bean執行個體對象
30 BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
31 priorityOrderedPostProcessors.add(pp);
32 if (pp instanceof MergedBeanDefinitionPostProcessor) {
33 internalPostProcessors.add(pp);
34 }
35 } else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
36 // 有序
37 orderedPostProcessorNames.add(ppName);
38 } else {
39 // 無序
40 nonOrderedPostProcessorNames.add(ppName);
41 }
42 }
43
44 // First, register the BeanPostProcessors that implement PriorityOrdered.
45 // 第一步:注冊所有實作了PriorityOrdered的BeanPostProcessor
46 // 排序
47 sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
48 // 注冊
49 registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
50
51 // Next, register the BeanPostProcessors that implement Ordered.
52 // 第二步:注冊所有實作了Ordered的BeanPostProcessor
53 List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
54 for (String ppName : orderedPostProcessorNames) {
55 BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
56 orderedPostProcessors.add(pp);
57 if (pp instanceof MergedBeanDefinitionPostProcessor) {
58 internalPostProcessors.add(pp);
59 }
60 }
61 // 排序
62 sortPostProcessors(orderedPostProcessors, beanFactory);
63 // 注冊
64 registerBeanPostProcessors(beanFactory, orderedPostProcessors);
65
66 // Now, register all regular BeanPostProcessors.
67 // 第三步:注冊所有無序的BeanPostProcessor
68 List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
69 for (String ppName : nonOrderedPostProcessorNames) {
70 BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
71 nonOrderedPostProcessors.add(pp);
72 if (pp instanceof MergedBeanDefinitionPostProcessor) {
73 internalPostProcessors.add(pp);
74 }
75 }
76 // 無序的注冊,不需要排序
77 registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
78
79 // Finally, re-register all internal BeanPostProcessors.
80 // 最後注冊所有MergedBeanDefinitionPostProcessor類型的BeanPostProcessor
81 sortPostProcessors(internalPostProcessors, beanFactory);
82 registerBeanPostProcessors(beanFactory, internalPostProcessors);
83
84 // Re-register post-processor for detecting inner beans as ApplicationListeners,
85 // moving it to the end of the processor chain (for picking up proxies etc).
86 // 加入ApplicationListenerDetector(探測器)
87 // 重新注冊BeanPostProcessor以檢測内部bean,因為ApplicationListenerDetector将其移動到處理器鍊的末尾
88 beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
89 }
上述代碼雖稍微有一點長,但整體邏輯還是比較簡單,就是對BeanPostProcessor進行注冊,按照PriorityOrdered 、 Ordered、nonOrdered三種分支進行處理。
AbstractApplicationContext#initMessageSource
1 protected void initMessageSource() {
2 ConfigurableListableBeanFactory beanFactory = getBeanFactory();
3 // 包含"messageSource"bean
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 // 如果有父類
8 // HierarchicalMessageSource分級處理MessageSource
9 if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {
10 HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;
11 if (hms.getParentMessageSource() == null) {
12 // Only set parent context as parent MessageSource if no parent MessageSource
13 // registered already.
14 // 如果沒有注冊父MessageSource,則設定為父類上下文的MessageSource
15 hms.setParentMessageSource(getInternalParentMessageSource());
16 }
17 }
18 if (logger.isTraceEnabled()) {
19 logger.trace("Using MessageSource [" + this.messageSource + "]");
20 }
21 } else {
22 // 使用空MessageSource
23 // Use empty MessageSource to be able to accept getMessage calls.
24 DelegatingMessageSource dms = new DelegatingMessageSource();
25 dms.setParentMessageSource(getInternalParentMessageSource());
26 this.messageSource = dms;
27 beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
28 if (logger.isTraceEnabled()) {
29 logger.trace("No '" + MESSAGE_SOURCE_BEAN_NAME + "' bean, using [" + this.messageSource + "]");
30 }
31 }
32 }
這裡主要初始化MessageSource接口實作類,主要用于國際化。
AbstractApplicationContext#initApplicationEventMulticaster
1 protected void initApplicationEventMulticaster() {
2 ConfigurableListableBeanFactory beanFactory = getBeanFactory();
3 // 如果存在applicationEventMulticaster bean,則擷取指派
4 if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
5 this.applicationEventMulticaster =
6 beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
7 if (logger.isTraceEnabled()) {
8 logger.trace("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");
9 }
10 } else {
11 // 如果沒有,則建立SimpleApplicationEventMulticaster,并完成bean的注冊
12 this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
13 beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
14 if (logger.isTraceEnabled()) {
15 logger.trace("No '" + APPLICATION_EVENT_MULTICASTER_BEAN_NAME + "' bean, using " +
16 "[" + this.applicationEventMulticaster.getClass().getSimpleName() + "]");
17 }
18 }
19 }
初始化上下文事件廣播器,如果目前容器中存在 applicationEventMulticaster 的 bean,則對 applicationEventMulticaster 指派,否則建立一個 SimpleApplicationEventMulticaster 的對象(預設的),并完成注冊。
AbstractApplicationContext#onRefresh
預留給 AbstractApplicationContext 的子類用于初始化其他特殊的 bean,該方法需要在所有單例 bean 初始化之前調用。
AbstractApplicationContext#registerListeners
1 protected void registerListeners() {
2 // Register statically specified listeners first.
3 // 注冊靜态監聽器
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 String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
11 for (String listenerBeanName : listenerBeanNames) {
12 getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
13 }
14
15 // Publish early application events now that we finally have a multicaster...
16 // 至此,已經完成将監聽器注冊到ApplicationEventMulticaster中,下面将釋出前期的事件給監聽器
17 Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;
18 this.earlyApplicationEvents = null;
19 if (earlyEventsToProcess != null) {
20 for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
21 getApplicationEventMulticaster().multicastEvent(earlyEvent);
22 }
23 }
24 }
分析:在所有 bean中查找 listener bean,然後注冊到廣播器中。
AbstractApplicationContext#finishBeanFactoryInitialization
1 protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
2 // Initialize conversion service for this context.
3 // 初始化轉換器
4 if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&
5 beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {
6 beanFactory.setConversionService(
7 beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));
8 }
9
10 // Register a default embedded value resolver if no bean post-processor
11 // (such as a PropertyPlaceholderConfigurer bean) registered any before:
12 // at this point, primarily for resolution in annotation attribute values.
13 // 如果之前沒有注冊bean後置處理器,則注冊預設的解析器
14 if (!beanFactory.hasEmbeddedValueResolver()) {
15 beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));
16 }
17
18 // 初始化 Initialize LoadTimeWeaverAware beans early to allow for registering their transformers early.
19 String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
20 for (String weaverAwareName : weaverAwareNames) {
21 getBean(weaverAwareName);
22 }
23
24 // Stop using the temporary ClassLoader for type matching.
25 // 停止使用臨時的classLoader
26 beanFactory.setTempClassLoader(null);
27
28 // Allow for caching all bean definition metadata, not expecting further changes.
29 beanFactory.freezeConfiguration();
30
31 // Instantiate all remaining (non-lazy-init) singletons.
32 // 初始化所有剩餘的單例(非延遲初始化)
33 beanFactory.preInstantiateSingletons();
34 }
分析:初始化剩下的單例Bean(非延遲加載的)
AbstractApplicationContext#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 }
分析:完成重新整理過程,通知生命周期處理器 lifecycleProcessor 重新整理過程,同時發出 ContextRefreshEvent 通知别人
總結
本文隻是對AbstractApplicationContext的一些方法進行了簡要介紹,并沒有進行非常詳細的分析,因為加載BeanDefinition階段才是我們的重點,現在BeanDefinition有了,接下來就是看spring是如何執行個體化Bean了。
by Shawn Chen,2018.12.25日,晚。