我们都知道BeanFactory 仅提供bean的配置信息加载和创建工作,ApplicationContext 可以理解为是BeanFactory的扩展,ApplicationContext包含了BeanFactory的所有功能,并且对BeanFactory提供了一些企业级的扩展。
AbstractApplicationContext.refresh()方法,是整个ApplicationContext的入口方法,就从这个方法开始探究ApplicationContext容器是怎么刷新的。
public void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {/*** 初始化前的准备工作,例如对系统属性或者环境变量进行准备及验证。* 在某种情况下项目的使用需要读取某些系统变量, 而这个变量的设置很可能会影响着系统的正确性* 那么ClassPathXmlApplicationContext为我们提供的这个准备函数就显得非常必要* 它可以在Spring启动的时候提前对必需的变量进行存在性验证。*/prepareRefresh();// Tell the subclass to refresh the internal bean factory.// 初始化BeanFactory,并进行XML文件读取。ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();// Prepare the bean factory for use in this context.// 对BeanFactory进行各种功能填充。// @Qualifier与@Autowired这两个注解正是在这一步骤中增加的支持。prepareBeanFactory(beanFactory);try {// Allows post-processing of the bean factory in context subclasses./*** 子类覆盖方法做额外的处理。* 空的函数实现postProcessBeanFactory来方便程序员在业务上做进一步扩展。*/postProcessBeanFactory(beanFactory);// 激活各种BeanFactoryPostProcessor后置处理器。(典型的有MyBatis的MapperScannerConfigurer)invokeBeanFactoryPostProcessors(beanFactory);// 注册BeanPostProcessor,这里只是注册,真正的调用是在getBean时候// 注册的定义就是将BeanPostProcessor实例交给BeanFactory管理,放在BeanFactory对象的map属性中registerBeanPostProcessors(beanFactory);// 为上下文初始化Message资源,即对不同语言的消息体进行国际化处理initMessageSource();// 初始化事件广播器,广播器的作用是用来存放监听器并在合适的时候调用监听器initApplicationEventMulticaster();// 空方法,留给子类实现onRefresh();// 在所有注册的bean中查找listener bean,注册到消息广播器中。registerListeners();// 初始化剩下的单实例(非惰性的)finishBeanFactoryInitialization(beanFactory);// Last step: publish corresponding event.finishRefresh();}catch (BeansException ex) {if (logger.isWarnEnabled()) {logger.warn("Exception encountered during context initialization - " +"cancelling refresh attempt: " + ex);}// Destroy already created singletons to avoid dangling resources.destroyBeans();// Reset 'active' flag.cancelRefresh(ex);// Propagate exception to caller.throw ex;}finally {// Reset common introspection caches in Spring's core, since we// might not ever need metadata for singleton beans anymore...resetCommonCaches();}}}
1. 初始化前准备工作
在容器刷新前的一些初始化准备工作,例如:对系统属性和环境变量的校验工作。
protected void prepareRefresh() {// Switch to active.this.startupDate = System.currentTimeMillis();this.closed.set(false);this.active.set(true);if (logger.isInfoEnabled()) {logger.info("Refreshing " + this);}// 一个空方法,留给子类实现initPropertySources();// 验证需要的属性是否已经放入环境中getEnvironment().validateRequiredProperties();// Store pre-refresh ApplicationListeners...if (this.earlyApplicationListeners == null) {this.earlyApplicationListeners = new LinkedHashSet<>(this.applicationListeners);}else {// Reset local application listeners to pre-refresh state.this.applicationListeners.clear();this.applicationListeners.addAll(this.earlyApplicationListeners);}// Allow for the collection of early ApplicationEvents,// to be published once the multicaster is available...this.earlyApplicationEvents = new LinkedHashSet<>();}
2. 加载BeanFatory
我们知道ApplicationContext容器是具有BeanFactory的功能的,就是在这里实现创建的BeanFactory,创建完后ApplicationContext就真正的具有BeanFactory的功能了。
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {// 由子类实现这个方法// 初始化BeanFactory,并读取XML文件,将BeanFactory对象属性放到当前容器中// 这里要注意,如果是SpringBoot,子类实现这个方法时,不会加载XML文件,因为加载工作已经在这之前已经被执行refreshBeanFactory();// 返回ApplicationContext中的beanFactory对象ConfigurableListableBeanFactory beanFactory = getBeanFactory();if (logger.isDebugEnabled()) {logger.debug("Bean factory for " + getDisplayName() + ": " + beanFactory);}return beanFactory;}
SpringBoot 的ApplicationContext容器实现refreshBeanFactory()方法的片段,是没有去创建beanFactory和加载配置的。这里我们有个了解就行,不做详述。我们的重点是分析非SpringBoot的ApplicationContext 实现refreshBeanFactory()方法
protected final void refreshBeanFactory() throws IllegalStateException {if (!this.refreshed.compareAndSet(false, true)) {throw new IllegalStateException("GenericApplicationContext does not support multiple refresh attempts: just call 'refresh' once");}this.beanFactory.setSerializationId(getId());}
2.1. 创建BeanFactory
在这里会创建DefaultListableBeanFactory对象,它是BeanFactory的实现。读取XML文件进行解析,对BeanFactory的相关属性赋值
protected final void refreshBeanFactory() throws BeansException {if (hasBeanFactory()) {destroyBeans();closeBeanFactory();}try {// 创建BeanFactory对象DefaultListableBeanFactory beanFactory = createBeanFactory();// 设置序列号beanFactory.setSerializationId(getId());// 定制BeanFactory对象属性// 其实就是设置allowBeanDefinitionOverriding和allowCircularReferences 属性// allowBeanDefinitionOverriding 允许覆盖已经同名bean的实例标识// allowCircularReferences 允许解决循环依赖标识customizeBeanFactory(beanFactory);// 从XML加载bean的配置loadBeanDefinitions(beanFactory);this.beanFactory = beanFactory;}catch (IOException ex) {throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);}}
2.1.1. 定制BeanFactory属性
这里只是设置了BeanFactory 工厂对象是否允许覆盖同名的bean和循环依赖
protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory) {// 允许覆盖同名的bean// false 不允许,true 允许if (this.allowBeanDefinitionOverriding != null) {beanFactory.setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding);}// 允许解决循环依赖// false 不允许,true 允许if (this.allowCircularReferences != null) {beanFactory.setAllowCircularReferences(this.allowCircularReferences);}}
2.1.2. 加载BeanDefinition
通过创建XmlBeanDefinitionReader对象,调用它的loadBeanDefinitions 信息,将bean配置信息转换为BeanDefinition对象,因为XmlBeanDefinitionReader 对象中具有BeanFactory,所以最终会把bean的beanDefinition交给BeanFactory
protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {// 为BeanFactory工程对象创建XmlBeanDefinitionReader对象XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);beanDefinitionReader.setEnvironment(this.getEnvironment());beanDefinitionReader.setResourceLoader(this);beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));initBeanDefinitionReader(beanDefinitionReader);// 加载bean配置信息loadBeanDefinitions(beanDefinitionReader);}
3. 准备BeanFactory
前面我们已经创建了BeanFactory对象,并且赋值给了ApplicationContext容器中的beanFactory属性。说明容器已经具备了BeanFactory对象,接下来需要对容器中的BeanFactory对象做一些准备工作
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {// 设置BeanFactory的classLoader为当前ApplicationContext的classLoaderbeanFactory.setBeanClassLoader(getClassLoader());// 为beanFactory中添加表达式语言处理器// 处理如:#{bean.xxx}的表达式beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));// 为beanFactory中添加propertyEditor// 这是一个对bean的属性管理的一个工具类// 还可以实现PropertyEditorRegistry 接口,自定义属性管理器然后注册到beanFactory中,具体这里不做详述beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));// 为beanFactory添加一个ApplicationContextAwareProcessor后置处理器// 这个后置处理器的作用是在执行bean的初始化方法之前,检查bean是否为Aware类型,如果是先执行Aware对应的方法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);// 为beanFactory中添加一个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()));}// 注册几个默认的bean// 这些bean作为单实例bean放入IOC容器中// 直接通过getBean(name)的方式就可以获取这些beanif (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());}if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());}if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());}}
4. 处理BeanFactory
这是一个空方法,留给子类实现的。在准备完BeanFactory工厂后,所有bean已经加载但还没实例化前,修改一些BeanDefinition。
protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {}
5. 注册、激活BeanFactoryPostProcessor
BeanFactoryPostProcessor和BeanPostProcessor 基本类似,只是执行时机不同。BeanFactoryPostProcessor执行时机是在实例化bean前执行(典型有MyBatis的整合,通过MapperScannerConfigurer类来扫描MyBatis的接口和配置)。而BeanPostProcessor执行时机是在创建bean的实例阶段,在Bean的实例创建前后和bean的初始化方法前后做一些扩展。我们知道Spring之所以强大为程序员所追捧,是因为他的扩展性开放性。而PostProcessor就是实现扩展性和开放性的最好体现,程序员只需要实现接口来扩展自己的业务。
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());// Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime// (e.g. through an @Bean method registered by ConfigurationClassPostProcessor)if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));}}
BeanFactoryPostProcessor的注册和激活最终交给PostProcessorRegistrationDelegate来处理。BeanFactoryPostProcessor 后置处理器分为普通的BeanFactoryPostProcessor 后置处理器和BeanDefinitionRegistryPostProcessor 类型的后置处理器。这两个后置处理器的区别在于BeanDefinitionRegistryPostProcessor 多了一个postProcessBeanDefinitionRegistry()后置处理器方法。所以我们在执行后置处理器时,先执行BeanDefinitionRegistryPostProcessor类型postProcessBeanDefinitionRegistry()后置处理器方法,再执行postProcessBeanFactory()共有的后置处理器方法
注册、激活方法的逻辑:
- 先执行类型是BeanDefinitionRegistryPostProcessor 类型,且是硬编码的的后置处理器postProcessBeanDefinitionRegistry() 后置处理器方法
- 执行实现了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor后置处理器的postProcessBeanDefinitionRegistry() 后置处理器方法
- 执行实现了Ordered接口的BeanDefinitionRegistryPostProcessor后置处理器的自postProcessBeanDefinitionRegistry() 后置处理器方法
- 执行没有实现PriorityOrdered接口和Ordered接口的BeanDefinitionRegistryPostProcessor后置处理器的postProcessBeanDefinitionRegistry() 后置处理器方法
- 执行类型是BeanDefinitionRegistryPostProcessor 类型后置处理器的postProcessBeanFactory()后置处理器方法
执行类型是BeanFactoryPostProcessor类型的后置处理器,按照实现了PriorityOrdered和Ordered 接口的顺序先后执行postProcessBeanFactory() 后置处理器方法,最后再执行没有实现排序接口postProcessBeanFactory() 后置处理器方法。并排除BeanDefinitionRegistryPostProcessor类型,因为这个类型在之前已经执行过。
public static void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {// 记录被invoke激活过postProcessBeanDefinitionRegistry()方法的BeanFactoryPostProcessor 后置处理器bean名称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<>();// 处理硬编码注册的后置处理器for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {// 处理BeanDefinitionRegistryPostProcessor 这类特殊类型的后置处理器,这类后置处理器比普通后置处理器多了一个postProcessBeanDefinitionRegistry()后置处理器方法BeanDefinitionRegistryPostProcessor registryProcessor =(BeanDefinitionRegistryPostProcessor) postProcessor;// 执行BeanDefinitionRegistryPostProcessor 这类特殊类型的后置处理器的特殊方法,既:postProcessBeanDefinitionRegistry()registryProcessor.postProcessBeanDefinitionRegistry(registry);// 记录BeanDefinitionRegistryPostProcessor 这类特殊类型的后置处理器registryProcessors.add(registryProcessor);}else {// 记录硬编码注册的常规后置处理器regularPostProcessors.add(postProcessor);}}// 通过配置注册的BeanDefinitionRegistryPosProcessorList<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();// First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.// 获取配置注册的BeanDefinitionRegistryPostProcessor后置处理器// 处理实现了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor后置处理器String[] postProcessorNames =beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);for (String ppName : postProcessorNames) {// 实现了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor后置处理器if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));processedBeans.add(ppName);}}// 对实现了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor后置处理器进行排序sortPostProcessors(currentRegistryProcessors, beanFactory);// 记录是BeanDefinitionRegistryPostProcessor 类型的后置处理器,用于在后续统一激活该后置处理器的BeanFactoryPostProcessor的实现方法registryProcessors.addAll(currentRegistryProcessors);// 执行实现了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor后置处理器的自定义方法invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);currentRegistryProcessors.clear();// Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.// 获取配置注册的BeanDefinitionRegistryPostProcessor后置处理器// 处理实现了Ordered 接口的BeanDefinitionRegistryPostProcessor后置处理器postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);for (String ppName : postProcessorNames) {// 实现了Ordered接口的BeanDefinitionRegistryPostProcessor后置处理器if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));processedBeans.add(ppName);}}// 对实现了Ordered接口的BeanDefinitionRegistryPostProcessor后置处理器进行排序sortPostProcessors(currentRegistryProcessors, beanFactory);// 记录是BeanDefinitionRegistryPostProcessor 类型的后置处理器,用于在后续统一激活该后置处理器的BeanFactoryPostProcessor的实现方法registryProcessors.addAll(currentRegistryProcessors);// 执行实现了Ordered接口的BeanDefinitionRegistryPostProcessor后置处理器的自定义方法invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);currentRegistryProcessors.clear();// Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.// 最后执行没有实现PriorityOrdered和Ordered接口的BeanDefinitionRegistryPostProcessor后置处理器(常规的BeanDefinitionRegistryPostProcessor后置处理器)boolean reiterate = true;while (reiterate) {reiterate = false;postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);for (String ppName : postProcessorNames) {if (!processedBeans.contains(ppName)) {currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));processedBeans.add(ppName);reiterate = true;}}// 对常规的BeanDefinitionRegistryPostProcessor后置处理器进行排序sortPostProcessors(currentRegistryProcessors, beanFactory);// 记录是BeanDefinitionRegistryPostProcessor 类型的后置处理器,用于在后续统一激活该后置处理器的BeanFactoryPostProcessor的实现方法registryProcessors.addAll(currentRegistryProcessors);// 执行常规的BeanDefinitionRegistryPostProcessor后置处理器的自定义方法invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);currentRegistryProcessors.clear();}// Now, invoke the postProcessBeanFactory callback of all processors handled so far.// 激活类型是BeanDefinitionRegistryPostProcessor后置处理器的postProcessBeanFactory()方法invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);// 激活硬编码注册的常规后置处理器BenFactoryPostProcessor后置处理器// 常规的意思是指不是BeanDefinitionRegistryPostProcessor类型的后置处理器,但是BeanFactoryPostProcess类型的后置处理器invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);}else {// 执行上下文中注册的工厂处理器invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);}// 获取所有BeanFactoryPostProcessor 类型的后置处理器名称String[] postProcessorNames =beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);// Separate between BeanFactoryPostProcessors that implement PriorityOrdered,// Ordered, and the rest.// 对BeanFactoryPostProcessor 后置处理器按照优先级分类// 实现PriorityOrdered接口的后置处理器List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();// 实现了Ordered接口的后置处理器的bean名称List<String> orderedPostProcessorNames = new ArrayList<>();// 存放常规的没有实现排序接口(PriorityOrdered和Ordered接口)的后置处理器的bean名称List<String> nonOrderedPostProcessorNames = new ArrayList<>();for (String ppName : postProcessorNames) {if (processedBeans.contains(ppName)) {// 如果bean已经处理过,不再处理// skip - already processed in first phase above}else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {// 实现了PriorityOrdered 接口的BeanFactoryPostProcessor 后置处理器priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));}else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {// 实现了Ordered 接口的BeanFactoryPostProcessor 后置处理器bean名称orderedPostProcessorNames.add(ppName);}else {// 没有实现排序的BeanFactoryPostProcessor 后置处理器bean名称nonOrderedPostProcessorNames.add(ppName);}}// First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.// 对实现了PriorityOrdered接口的BeanFactoryPostProcessor后置处理器进行排序sortPostProcessors(priorityOrderedPostProcessors, beanFactory);// 激活实现了PriorityOrdered接口的BeanFactoryPostProcessor后置处理器,既:调用后置处理器的postProcessBeanFactory()方法invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);// Next, invoke the BeanFactoryPostProcessors that implement Ordered.// 获取实现了Ordered接口的BeanFactoryPostProcessor 后置处理器List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>();for (String postProcessorName : orderedPostProcessorNames) {orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));}// 对实现了Ordered接口的BeanFactoryPostProcessor 后置处理器排序sortPostProcessors(orderedPostProcessors, beanFactory);// 激活实现了Ordered接口的BeanFactoryPostProcessor 后置处理器,既:调用后置处理器的postProcessBeanFactory()方法invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);// Finally, invoke all other BeanFactoryPostProcessors.// 没有实现PriorityOrdered和Ordered接口的BeanFactoryPostProcessor 后置处理器List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>();for (String postProcessorName : nonOrderedPostProcessorNames) {nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));}// 激活BeanFactoryPostProcessor 后置处理器,既:调用后置处理器的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();}
6. 注册BeanPostProcessor
我们知道在getBean()的时,实例化bean和初始化bean前后会执行一些后置处理器,那么这些后置处理器是从哪里来的呢?就是在这一步时把所有关于getBean()时所需的后置处理器注册到beanFactory中。在这里不会执行后置处理器,只会把后置处理器加入到beanFactory的属性中,具体的后置处理器执行会在getBean()的时候执行
protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);}
BeanPostProcessor后置处理器注册进beanFactory,具体是由PostProcessorRegistrationDelegate.registerBeanPostProcessors()方法来实现
public static void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {// 获取注册的BeanPostProcessor后置处理器名称String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);// 整个容器中的后置处理器数量int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;// 添加一个打印后置处理器是否全部正常注册成功的后置处理器// 如果被注册的后置处理器的数量少于整个容器中后置处理器的数量,就打印出信息beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));// Ordered, and the rest.// 存放实现了PriorityOrdered接口的BeanPostProcessorList<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();// 存放MergedBeanDefinitionPostProcessor 类型的后置处理器// MergedBeanDefinitionPostProcessor也是继承BeanPostProcessor接口,具有BeanPostProcessor功能List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();// 存放实现了Ordered接口的BeanPostProcessorList<String> orderedPostProcessorNames = new ArrayList<>();// 存放没有实现PriorityOrdered和Ordered排序接口的BeanPostProcessor,注册时不用保证顺序List<String> nonOrderedPostProcessorNames = new ArrayList<>();for (String ppName : postProcessorNames) {// 实现了PriorityOrdered接口的后置处理器if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {// 获取后置处理器beanBeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);// 将实现了PriorityOrdered接口的后置处理器加入到对应集合,在后续统一注册进BeanFactory中priorityOrderedPostProcessors.add(pp);// 如果是MergedBeanDefinitionPostProcessor 类型,单独处理if (pp instanceof MergedBeanDefinitionPostProcessor) {internalPostProcessors.add(pp);}}else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {// 将实现了Ordered接口的BeanPostProcessor后置处理器加入到对应集合,在后续统一注册进BeanFactory中orderedPostProcessorNames.add(ppName);}else {// 没有实现PriorityOrdered和Ordered接口的后置处理器加入对应集合,在后续统一注册进BeanFactory中nonOrderedPostProcessorNames.add(ppName);}}// 首先对实现了PriorityOrdered接口的BeanPostProcessor后置处理器排序sortPostProcessors(priorityOrderedPostProcessors, beanFactory);// 注册排序好的后置处理器,将后置处理器加入到BeanFactory的beanPostProcessors集合中registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);// 下一步,注册实现了Ordered接口的BeanPostProcessor后置处理器List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>();for (String ppName : orderedPostProcessorNames) {// 获取后置处理器对象BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);orderedPostProcessors.add(pp);// 如果是MergedBeanDefinitionPostProcessor 类型,单独处理if (pp instanceof MergedBeanDefinitionPostProcessor) {internalPostProcessors.add(pp);}}// 对实现了Ordered的BeanPostProcessor后置处理器排序sortPostProcessors(orderedPostProcessors, beanFactory);// 注册排序好的后置处理器,将后置处理器加入到BeanFactory的beanPostProcessors集合中registerBeanPostProcessors(beanFactory, orderedPostProcessors);// Now, register all regular BeanPostProcessors.// 注册将没有实现PriorityOrdered和Ordered接口的BeanPostProcessor后置处理器List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>();for (String ppName : nonOrderedPostProcessorNames) {// 获取后置处理器对象BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);// 不用保证有序的后置处理器nonOrderedPostProcessors.add(pp);// 如果是MergedBeanDefinitionPostProcessor 类型,单独处理if (pp instanceof MergedBeanDefinitionPostProcessor) {internalPostProcessors.add(pp);}}// 注册剩余没有实现PriorityOrdered和Ordered接口的后置处理器,将后置处理器加入到BeanFactory的beanPostProcessors集合中// 因为是没有实现排序接口的后置处理器,所以不用保证有序就可以直接注册registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);// 最后,将对是MergedBeanDefinitionPostProcessor类型的后置处理器排序sortPostProcessors(internalPostProcessors, beanFactory);// 注册类型是MergedBeanDefinitionPostProcessor 类型的后置处理器registerBeanPostProcessors(beanFactory, internalPostProcessors);// 添加ApplicationListener 探测器beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));}
7. 初始化消息资源
为ApplicationContext初始化消息资源,消息资源可以对不同的消息进行国际化。这个方法的逻辑很简单,如果有自定义消息资源管理器就使用自定义的,没有就使用默认的消息资源管理器
protected void initMessageSource() {ConfigurableListableBeanFactory beanFactory = getBeanFactory();// 如果配置了messageSource就使用配置的if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {// 创建自定义配置的消息资源bean// 将自定义配置的messageSource对象记录在messageSource变量中this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);// Make MessageSource aware of parent MessageSource.if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;if (hms.getParentMessageSource() == null) {// Only set parent context as parent MessageSource if no parent MessageSource// registered already.hms.setParentMessageSource(getInternalParentMessageSource());}}if (logger.isDebugEnabled()) {logger.debug("Using MessageSource [" + this.messageSource + "]");}}else {// 没有配置messageSource,就使用默认的// Use empty MessageSource to be able to accept getMessage calls.DelegatingMessageSource dms = new DelegatingMessageSource();dms.setParentMessageSource(getInternalParentMessageSource());this.messageSource = dms;// 将默认的messageSource注册到单实例bean中beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);if (logger.isDebugEnabled()) {logger.debug("Unable to locate MessageSource with name '" + MESSAGE_SOURCE_BEAN_NAME +"': using default [" + this.messageSource + "]");}}}
8. 初始化事件广播器
Spring中为我们提供了事件监听功能,事件的发布都是通过事件广播器来发布的,将事件发布出去,事件监听器就能够监听到事件。事件广播器如果可能在这之前就已经创建,比如启动SpringBoot启动时,会提前创建事件广播器。如果已经创建就使用已经创建的事件广播器,没有就使用默认的事件广播器。
protected void initApplicationEventMulticaster() {ConfigurableListableBeanFactory beanFactory = getBeanFactory();// 监听器存在,直接从beanFactory中获取if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {this.applicationEventMulticaster =beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);if (logger.isDebugEnabled()) {logger.debug("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");}}else {// 监听器不存在,注册一个SimpleApplicationEventMulticaster类型的监听器到IOC容器中// 注册的意思就是将实例对象作为一个单实例bean放到singletonObjects缓存中this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);if (logger.isDebugEnabled()) {logger.debug("Unable to locate ApplicationEventMulticaster with name '" +APPLICATION_EVENT_MULTICASTER_BEAN_NAME +"': using default [" + this.applicationEventMulticaster + "]");}}}
8.1. 默认事件广播器
SimpleApplicationEventMulticaster 作为默认的事件广播器,里面存放了所有的事件监听器,通过事件广播器发布事件时,会循环调用在事件广播器中的所有监听器
@Overridepublic void multicastEvent(final ApplicationEvent event, @Nullable ResolvableType eventType) {ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event));// 遍历监听器,分别执行invokeListener()方法for (final ApplicationListener<?> listener : getApplicationListeners(event, type)) {Executor executor = getTaskExecutor();// 如果有线程任务,异步执行,最终会执行到监听器的onApplicationEvent()方法if (executor != null) {// 单独起一个线程,异步执行executor.execute(() -> invokeListener(listener, event));}else {// 没有线程任务,同步执行监听器的onApplicationEvent()方法invokeListener(listener, event);}}}
9. 注册监听器
前面我们已经创建了事件广播器,那么这里将会把监听器添加到事件广播器中。如有有早期需要广播的事件,会将早期事件通过事件广播器广播出去。
在通过事件广播器发布事件时,这些被添加到的事件监听器将会监听到事件。这其实就是典型的观察者模式。
protected void registerListeners() {// 硬编码的方式注册事件监听器for (ApplicationListener<?> listener : getApplicationListeners()) {getApplicationEventMulticaster().addApplicationListener(listener);}// 通过配置文件注册的监听器处理String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);for (String listenerBeanName : listenerBeanNames) {getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);}// 早期事件Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;this.earlyApplicationEvents = null;// 如果有早期事件需要广播,通过事件广播器将事件发布if (earlyEventsToProcess != null) {// 循环所有早期事件,通过事件广播器将事件广播出去// 那些被匹配到的事件监听器将监听到事件for (ApplicationEvent earlyEvent : earlyEventsToProcess) {getApplicationEventMulticaster().multicastEvent(earlyEvent);}}}
10. 创建非延时加载的单例bean
将beanFactory中还没有被创建的单实例bean,进行创建。
protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {// 为ApplicationContext添加转换器服务// 如果容器中存在bean名字为:conversionService的bean,同时类型又是ConversionService.class类型// 就说明配置了ConverterService,将其添加到beanFactory的conversionService属性中if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {beanFactory.setConversionService(beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));}// Register a default embedded value resolver if no bean post-processor// (such as a PropertyPlaceholderConfigurer bean) registered any before:// at this point, primarily for resolution in annotation attribute values.if (!beanFactory.hasEmbeddedValueResolver()) {beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));}// Initialize LoadTimeWeaverAware beans early to allow for registering their transformers early.String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);for (String weaverAwareName : weaverAwareNames) {getBean(weaverAwareName);}// Stop using the temporary ClassLoader for type matching.beanFactory.setTempClassLoader(null);// 冻结所有bean的定义// 说明在这一步之后,bean的BeanDefinition信息将不能被修改beanFactory.freezeConfiguration();// 创建剩余所有还没有被创建的beanbeanFactory.preInstantiateSingletons();}
10.1. 创建剩余bean
ApplicationContext 的实现默认就是在启动时将所有的非延时加载的bean进行创建,而非等到用到该bean时才创建。这么做的好处就是如果bean的创建存在一些问题,在项目启动时就能够发现,而不是等到项目部署以后,用到某个bean时在创建才发现问题,有时某些bean并不是马上就会用到,可能好几天后才能用到。
在前面的几个步骤我们已经创建了一些bean,接下来就是把那些还没有被创建的bean创建出来。
public void preInstantiateSingletons() throws BeansException {if (logger.isDebugEnabled()) {logger.debug("Pre-instantiating singletons in " + this);}// 被定义的beanName集合List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);// 遍历beanName,创建beanfor (String beanName : beanNames) {// 根据beanName 获取bean的定义信息RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);// 校验bean的定义信息// 只创建非抽象类,是单实例bean,非延迟创建的beanif (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {// 创建FactoryBean类型的beanif (isFactoryBean(beanName)) {Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);if (bean instanceof FactoryBean) {FactoryBean<?> factory = (FactoryBean<?>) bean;boolean isEagerInit;if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {isEagerInit = AccessController.doPrivileged((PrivilegedAction<Boolean>) ((SmartFactoryBean<?>) factory)::isEagerInit,getAccessControlContext());}else {isEagerInit = (factory instanceof SmartFactoryBean &&((SmartFactoryBean<?>) factory).isEagerInit());}if (isEagerInit) {getBean(beanName);}}}else {// 创建非FatoryBean类型的beangetBean(beanName);}}}// Trigger post-initialization callback for all applicable beans...// 至此,我们已经创建好了所有的非延时加载的bean// 这里将会对SmartInitializingSingleton 类型的bean,执行它的回调方法for (String beanName : beanNames) {Object singletonInstance = getSingleton(beanName);if (singletonInstance instanceof SmartInitializingSingleton) {SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;// 安全检查的beanif (System.getSecurityManager() != null) {AccessController.doPrivileged((PrivilegedAction<Object>) () -> {smartSingleton.afterSingletonsInstantiated();return null;}, getAccessControlContext());}else {// 执行回调方法smartSingleton.afterSingletonsInstantiated();}}}}
11. 完成刷新
在Spring的ApplicationContext 创建完成,所有的非延迟加载的单实例bean被创建后,Spring为我们提供了LifeCycle 接口,通过实现这个接口,在最后会调用LifeCycle接口的start()方法,并在Spring关闭时调用LifeCycle的stop()方法。我们可以实现这个接口来扩展一些功能,如:启动一个后台允许的线程,轮询的收集一些允许信息等
protected void finishRefresh() {// 清除上下文中的resourceCaches缓存clearResourceCaches();// 初始化LifeCycle 处理器// 启动LifeCycle接口的方法是通过这个处理器来启动initLifecycleProcessor();// 通过Lifecycle处理器启动LifeCycle 接口的start()getLifecycleProcessor().onRefresh();// Publish the final event.publishEvent(new ContextRefreshedEvent(this));// Participate in LiveBeansView MBean, if active.LiveBeansView.registerApplicationContext(this);}
11.1. 初始化LifeCycleProcessor
创建LifeCycleProcessor处理器,如果有自定义的处理器就创建自定义处理器,没有使用默认的处理器
protected void initLifecycleProcessor() {ConfigurableListableBeanFactory beanFactory = getBeanFactory();// 如果LifeCycleProcessor已经创建,或者已经定义了处理器的名称:lifecycleProcessor// 那么通过getBean()获取处理器对象if (beanFactory.containsLocalBean(LIFECYCLE_PROCESSOR_BEAN_NAME)) {this.lifecycleProcessor =beanFactory.getBean(LIFECYCLE_PROCESSOR_BEAN_NAME, LifecycleProcessor.class);if (logger.isTraceEnabled()) {logger.trace("Using LifecycleProcessor [" + this.lifecycleProcessor + "]");}}else {// 还没有定义LifeCycleProcessor处理器的名称// 创建一个默认的处理器,并注册到beanFactory中作为一个单实例beanDefaultLifecycleProcessor defaultProcessor = new DefaultLifecycleProcessor();defaultProcessor.setBeanFactory(beanFactory);this.lifecycleProcessor = defaultProcessor;beanFactory.registerSingleton(LIFECYCLE_PROCESSOR_BEAN_NAME, this.lifecycleProcessor);if (logger.isTraceEnabled()) {logger.trace("No '" + LIFECYCLE_PROCESSOR_BEAN_NAME + "' bean, using " +"[" + this.lifecycleProcessor.getClass().getSimpleName() + "]");}}}
11.2. 启动start()
通过LifeCycle处理器,执行所有实现LifeCycle接口类的start()方法
public void onRefresh() {// 执行start()startBeans(true);// LifeCycle 接口运行中标识this.running = true;}
交给startBeans()方法处理
private void startBeans(boolean autoStartupOnly) {// 从beanFactory获取已经被创建的LifeCycle 的beanMap<String, Lifecycle> lifecycleBeans = getLifecycleBeans();Map<Integer, LifecycleGroup> phases = new HashMap<>();// 遍历所有LifeCycle beanlifecycleBeans.forEach((beanName, bean) -> {// 只允许非自启动和bean是SmartLifeCycle类型,且是自动启动if (!autoStartupOnly || (bean instanceof SmartLifecycle && ((SmartLifecycle) bean).isAutoStartup())) {// 如果实现了Phased接口,根据Phase 分组,如果没有默认组是0// 将需LifeCycle bean放到各自的组LifeCycleGroup中的members属性中// 标识这个组中有哪些LifeCycle beanint phase = getPhase(bean);LifecycleGroup group = phases.get(phase);if (group == null) {// 新建一个组,用于存放本组需要执行的LifeCycle成员group = new LifecycleGroup(phase, this.timeoutPerShutdownPhase, lifecycleBeans, autoStartupOnly);// 把新建的组放到map中,key为组名称int类型,value 组对象phases.put(phase, group);}// 往组中添加LifeCycle成员group.add(beanName, bean);}});if (!phases.isEmpty()) {List<Integer> keys = new ArrayList<>(phases.keySet());Collections.sort(keys);// 遍历所有的组for (Integer key : keys) {// 执行组里所有成员的start()phases.get(key).start();}}}
11.2.1. 获取LifeCycle对象
从beanFactory中获取已经加载的LIfeCycle接口的实现对象
protected Map<String, Lifecycle> getLifecycleBeans() {// 当前ApplicationContext中的beanFactoryConfigurableListableBeanFactory beanFactory = getBeanFactory();// 存放LifeCycle bean,key为beanName,value为LifeCycle对象Map<String, Lifecycle> beans = new LinkedHashMap<>();// 获取所有已经被创建的LifeCycle类型的beanNameString[] beanNames = beanFactory.getBeanNamesForType(Lifecycle.class, false, false);// 遍历所有LifeCycle的beanNamefor (String beanName : beanNames) {// 如果beanName中第一个字符是&,去掉&字符String beanNameToRegister = BeanFactoryUtils.transformedBeanName(beanName);// 校验是不是实现了FactoryBean,也就是说是不是FactoryBean类型的beanboolean isFactoryBean = beanFactory.isFactoryBean(beanNameToRegister);// 识别beanName// 如果是FactoryBean类型的bean,获取它的原始bean,需要在beanName前加&字符,否则不用处理beanNameString beanNameToCheck = (isFactoryBean ? BeanFactory.FACTORY_BEAN_PREFIX + beanName : beanName);// 条件一// 单实例bean中有beanName是beanNameToRegister 名称的bean// 并且不是FactoryBean类型,或者根据beanNameToCheck名称能匹配到LifeCycle类型的bean// 条件二// 是SmartLifecycle 类型的bean// 满足其中一个条件即可if ((beanFactory.containsSingleton(beanNameToRegister) &&(!isFactoryBean || matchesBeanType(Lifecycle.class, beanNameToCheck, beanFactory))) ||matchesBeanType(SmartLifecycle.class, beanNameToCheck, beanFactory)) {// 获取bean的原始实例// 为什么说是原始实例,是因为如果bean是FactoryBean类型的,通过beanName获取到的是getObject()方法的对象,而不是这个对象本身// 如果想要获得原始实例,需要在beanName前加&字符// 非BeanFactory类型的bean,根据beanName就能获取到实例本身Object bean = beanFactory.getBean(beanNameToCheck);if (bean != this && bean instanceof Lifecycle) {// 放到map集合中beans.put(beanNameToRegister, (Lifecycle) bean);}}}return beans;}
11.2.2. 执行start()
LifecycleGroup 中执行本组中所有LifeCycle成员的start()
public void start() {if (this.members.isEmpty()) {return;}if (logger.isInfoEnabled()) {logger.info("Starting beans in phase " + this.phase);}Collections.sort(this.members);for (LifecycleGroupMember member : this.members) {doStart(this.lifecycleBeans, member.name, this.autoStartupOnly);}}
11.3. 发布事件
启动完LifeCycle接口的start()方法后,紧接着发布一个ContextRefreshedEvent 事件
protected void publishEvent(Object event, @Nullable ResolvableType eventType) {Assert.notNull(event, "Event must not be null");if (logger.isTraceEnabled()) {logger.trace("Publishing event in " + getDisplayName() + ": " + event);}// 如果有需要,将事件对象转换为ApplicationEventApplicationEvent applicationEvent;if (event instanceof ApplicationEvent) {applicationEvent = (ApplicationEvent) event;}else {// 非ApplicationEvent类型的事件,装饰为PayloadApplicationEvent 对象applicationEvent = new PayloadApplicationEvent<>(this, event);if (eventType == null) {eventType = ((PayloadApplicationEvent<?>) applicationEvent).getResolvableType();}}// 早期事件,在注册监听器的时候,会广播事件if (this.earlyApplicationEvents != null) {this.earlyApplicationEvents.add(applicationEvent);}else {// 广播事件getApplicationEventMulticaster().multicastEvent(applicationEvent, eventType);}// Publish event via parent context as well...if (this.parent != null) {if (this.parent instanceof AbstractApplicationContext) {((AbstractApplicationContext) this.parent).publishEvent(event, eventType);}else {this.parent.publishEvent(event);}}}
