【spring源码分析】IOC容器初始化(五)
前言:前几篇文章已经将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日,晚。