Spring中bean的后置处理器的调用时间节点及大致作用
原创,转载注明出处。
1、InstantiationAwareBeanPostProcessor->postProcessBeforeInstantiation
这个方法是spring第一次调用的后置处理器方法
在实例化之前调用,可以控制bean的生产过程,直接返回bean的实例。
当这个方法返回值不为null时候,会调用postProcessAfterInstantiation方法。详见5
2、SmartInstantiationAwareBeanPostProcessor->determineCandidateConstructors
此方法的含义是解析Bean类里构造函数上的@Autowired注解,如果有合适的标识了@Autowired的构造函数,在实例化此Bean时会使用此构造函数
@Import和@ComponentScan得到的Bean会如此解析,@Bean标识方法生成的Bean不会如此
3、MergedBeanDefinitionPostProcessor->postProcessMergedBeanDefinition
这个方法是在创建bean的早期对象之后,调用属性赋值方法(populateBean())之前
用来解析@Autowired @Value @Inject等注解,进行父子对象的属性合并。将属性保存到同一个key对应的定义中。后由populateBean方法进行解析赋值
4、SmartInstantiationAwareBeanPostProcessor->getEarlyBeanReference
当发生循环依赖时,需要将早期对象暴露到第三级缓存中去。
在放入三级缓存之前,可以调用实现了SmartInstantiationAwareBeanPostProcessor接口的方法getEarlyBeanReference进行对bean修改。
5、InstantiationAwareBeanPostProcessor->postProcessAfterInstantiation
属性赋值方法(populateBean)中调用,当方法1返回值不为null时调用。默认返回返回true
利用此方法返回值判断是否要自动装配属性,也就是说是否要处理@Autowired
如果返回false那么spring将不会自动进行属性填充
6、InstantiationAwareBeanPostProcessor->postProcessPropertyValues
属性赋值方法(populateBean)中调用,进行属性赋值,解析@Autowired、@Resource、@Inject
7、BeanPostProcessor->postProcessBeforeInitialization
实例化注入完毕后调用,postProcessBeforeInitialization()将会进行@Valid验证,调用bean的@PostConstruct方法。
其返回值将替代原始的Bean对象。
8、BeanPostProcessor->postProcessAfterInitialization
实例化、依赖注入、初始化完毕时执行,处理AOP和事务的代理对象