Spring中关于@Autowired注解和@Value注解的处理

发布时间 2023-12-18 18:23:47作者: 残城碎梦

Spring是在实例化之后、初始化之前调用BeanPostProcessor处理的。

///////////////////////////////////////////////////////////////////////////
// AbstractApplicationContext >>>> refresh()
///////////////////////////////////////////////////////////////////////////

/**
 * 【步骤11:将beanFactory的成员补充完毕,并初始化所有非延迟单例 bean】
 * conversionService:也是一套转换机制,作为对 PropertyEditor 的补充
 * embeddedValueResolvers:即内嵌值解析器,用来解析 @Value 中的 ${ },借用的是 Environment 的功能
 * singletonObjects:即单例池,缓存所有单例对象
 * 主要的创建流程如下:
 * (0)创建bean实例之前,若是InstantiationAwareBeanPostProcessor,则执行其applyBeanPostProcessorsBeforeInstantiation和applyBeanPostProcessorsAfterInitialization方法,
 *  无需再实例化,直接返回
 * (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);