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);
标签:缓存,Autowired,Spring,Bean,bean,实例,单例,创建,注解 From: https://www.cnblogs.com/xfeiyun/p/17911797.html