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();

部分步骤详细的源码解析:

posted @ 2023-12-02 15:31  残城碎梦  阅读(345)  评论(0编辑  收藏  举报