AbstractApplicationContext的核心方法refresh()分析
AbstractApplicationContext的refresh()是 Spring 最核心的方法,没有之一,上帝就是用这个方法创造了 Spring 的世界。这是一个同步方法,用synchronized关键字来实现的。该方法包含以下12个方法(步骤)。
- prepareRefresh()
- obtainFreshBeanFactory()
- prepareBeanFactory(beanFactory)
- postProcessBeanFactory(beanFactory)
- invokeBeanFactoryPostProcessors(beanFactory)
- registerBeanPostProcessors(beanFactory)
- initMessageSource()
- initApplicationEventMulticaster()
- onRefresh()
- registerListeners()
- finishBeanFactoryInitialization(beanFactory)
- finishRefresh()
各个步骤总结如下:
/**
* 【步骤1:刷新前准备工作】
* 创建和准备了 Environment 对象(StandardEnvironment),它作为 ApplicationContext 的一个成员变量
* Environment 对象的作用之一是为后续 @Value,值注入时提供键值
* Environment 分成三个主要部分
* - systemProperties 保存 java 环境键值
* - systemEnvironment 保存系统环境键值
* - 自定义 PropertySource 保存自定义键值,例如来自于 *.properties 文件的键值
* 另外,可以校验一些必须属性
**/
prepareRefresh();
/**
* 【步骤2:获取刷新的BeanFactory】
* 获取(或创建) BeanFactory(DefaultListableBeanFactory),它也是作为 ApplicationContext 的一个成员变量
* BeanFactory 的作用是负责 bean 的创建、依赖注入和初始化,bean 的各项特征由 BeanDefinition 定义
* BeanDefinition 的来源有多种多样,可以是通过 xml 获得、配置类获得、组件扫描获得,也可以是编程添加
* 该方法获取所有的 BeanDefinition 会存入 BeanFactory 中的 beanDefinitionMap 集合(包括Spring内置的,以及我们自定义的)
*
* 另外,此处会加载Spring内置的一些BeanDefinition
* - ConfigurationClassPostProcessor 很重要的一个类,后续用于解析注解配置类
* - AutowiredAnnotationBeanPostProcessor
* - RequiredAnnotationBeanPostProcessor
* - CommonAnnotationBeanPostProcessor
* - EventListenerMethodProcessor
* - DefaultEventListenerFactory
* - 等等
**/
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
/**
* 【步骤3:进一步完善 BeanFactory,为它的各项成员变量赋值】
* beanExpressionResolver:用来解析 SpEL,常见实现为 StandardBeanExpressionResolver
* propertyEditorRegistrars:注册类型转换器,这里使用了 ResourceEditorRegistrar 实现类,可以利用 ApplicationContext 提供的 Environment 完成 ${ } 解析
* registerResolvableDependency:注册 beanFactory 以及 ApplicationContext,让它们也能用于依赖注入
* beanPostProcessors:是 bean 后处理器集合,会工作在 bean 的生命周期各个阶段,此处会添加两个:
* - ApplicationContextAwareProcessor 用来解析 Aware 接口
* - ApplicationListenerDetector 用来识别容器中 ApplicationListener 类型的 bean
*
**/
prepareBeanFactory(beanFactory);
/**
* 【步骤4:空实现,留给子类扩展】
* 一般 Web 环境的 ApplicationContext 都要利用它注册新的 Scope,完善 Web 下的 BeanFactory
* 这里体现的是模板方法设计模式
**/
postProcessBeanFactory(beanFactory);
/**
* 【步骤5:调用 beanFactory 后处理器】
* 实例化所有的BeanDefinitionRegistryPostProcessor,并调用其postProcessBeanDefinitionRegistry方法
* 实例化所有的BeanFactoryPostProcessor,并调用其postProcessBeanFactory方法
*
* beanFactory 后处理器,充当 beanFactory 的扩展点,可以用来补充或修改 BeanDefinition
* 常见的beanFactory后处理器有:
* - ConfigurationClassPostProcessor:解析 @Configuration、@Bean、@Import、@PropertySource 等
* - PropertySourcesPlaceHolderConfigurer:替换 BeanDefinition 中的 ${ }
* 此处ConfigurationClassPostProcessor依次会解析处理这些注解
* - @PropertySource
* - @ComponentScan、@ComponentScans
* - @Import
* - @ImportResource
* - @Bean注解的方法
**/
invokeBeanFactoryPostProcessors(beanFactory);
/**
* 【步骤6:实例化bean后处理器】
* 实例化BeanPostProcessor, 添加至beanFactory的beanPostProcessors集合中(特别注意:这里只是实例化而已, 并没有执行BeanPostProcessor的方法)
*
* bean后处理器,充当 bean 的扩展点,可以工作在 bean 的实例化、依赖注入、初始化阶段,常见的有:
* - AutowiredAnnotationBeanPostProcessor 功能有:解析 @Autowired,@Value 注解
* - CommonAnnotationBeanPostProcessor 功能有:解析 @Resource,@PostConstruct,@PreDestroy
* - AnnotationAwareAspectJAutoProxyCreator 功能有:为符合切点的目标 bean 自动创建代理
*
**/
registerBeanPostProcessors(beanFactory);
/**
* 【步骤7:为 ApplicationContext 添加 messageSource 成员,实现国际化功能】
* 从 beanFactory 内找名为 messageSource 的 bean,如果没有,则提供空的 MessageSource 实现
**/
initMessageSource();
/**
* 【步骤8:为ApplicationContext 添加事件广播器成员,即 applicationContextEventMulticaster】
* 它的作用是发布事件给监听器
* 从beanFactory内找名为 applicationEventMulticaster 的 bean 作为事件广播器,若没有,会创建默认的事件广播器(SimpleApplicationEventMulticaster)
* 之后就可以调用 ApplicationContext.publishEvent(事件对象) 来发布事件
**/
initApplicationEventMulticaster();
/**
* 【步骤9:空实现,留给子类扩展】
* SpringBoot中的子类在这里准备了WebServer,即内嵌 web 容器
* 体现的是模板方法设计模式
**/
onRefresh();
/**
* 【步骤10:从多种途径找到事件监听器,并添加至 applicationEventMulticaster】
* 事件监听器顾名思义,用来接收事件广播器发布的事件,有如下来源:
* - 事先编程添加的
* - 来自容器中的 bean
* - 来自于 @EventListener 的解析
* 要实现事件监听器,只需要实现 ApplicationListener 接口,重写其中 onApplicationEvent(E e) 方法即可
*
**/
registerListeners();
/**
* 【步骤11:将beanFactory的成员补充完毕,并初始化所有非延迟单例 bean】
* conversionService:也是一套转换机制,作为对 PropertyEditor 的补充
* embeddedValueResolvers:即内嵌值解析器,用来解析 @Value 中的 ${ },借用的是 Environment 的功能
* singletonObjects:即单例池,缓存所有单例对象
* 主要的创建流程如下:
* (0) 可以通过实现InstantiationAwareBeanPostProcessor接口,自己创建实例,跳过Spring的实例创建过程
* (1) 创建bean实例, 即调用对象的构造方法实例化对象
* (2) populateBean设置属性:主要对 bean 的依赖属性注入(@Autowired、@Value)
* (3) initializeBean初始化
* - 触发BeanNameAware、BeanFactoryAware的相关方法
* - 执行BeanPostProcessor的postProcessBeforeInitialization方法
* - 执行InitializingBean的afterPropertiesSet方法
* - 执行自定义的init-method方法
* - 执行BeanPostProcessor的postProcessAfterInitialization方法
*
* (4) 实例化所有的非延迟单例bean后,会调用实现了SmartInitializingSingleton接口的单例bean的afterSingletonsInstantiated方法
*
* 此处用到了三级缓存用于处理单例bean的循环依赖(DefaultSingletonBeanRegistry的三个HashMap):
* - 一级缓存:singletonObjects 存放完全实例化且属性赋值完成的 Bean, 可以直接使用
* - 二级缓存:earlySingletonObjects 放早期 Bean 的引用,尚未装配属性的 Bean
* - 三级缓存:singletonFactories 存放实例化完成的 Bean 工厂
*
* 除了三级缓存,还有另外两个缓存
* - singletonsCurrentlyInCreation: bean 在创建的过程中都会存储在此,创建完成移出
* - alreadyCreated:存放至少被创建一次的 bean,不会重复。即标记 bean 是否创建完成
**/
finishBeanFactoryInitialization(beanFactory);
/**
* 【步骤12:为 ApplicationContext 添加 lifecycleProcessor 成员,用来控制容器内需要生命周期管理的 bean】
* 如果容器中有名称为 lifecycleProcessor 的 bean 就用它,否则创建默认的生命周期管理器
* 准备好生命周期管理器,就可以实现:
* - 调用 context 的 start,即可触发所有实现 LifeCycle 接口 bean 的 start
* - 调用 context 的 stop,即可触发所有实现 LifeCycle 接口 bean 的 stop
* - 发布 ContextRefreshed 事件,整个 refresh 执行完成
*
**/
finishRefresh();
部分步骤详细的源码解析:
- 【步骤2:获取刷新的BeanFactory】
- 【步骤5:调用 beanFactory 后置处理器】
- 【步骤11:将beanFactory的成员补充完毕,并初始化所有非延迟单例 bean】: