后置处理器
Spring提供了两种后处理bean的扩展接⼝,分别为 BeanPostProcessor 和BeanFactoryPostProcessor,两者在使⽤上是有所区别的。
⼯⼚初始化(BeanFactory)—> Bean对象
在BeanFactory初始化之后可以使⽤BeanFactoryPostProcessor进⾏后置处理做⼀些事情
在Bean对象实例化(并不是Bean的整个⽣命周期完成)之后可以使⽤BeanPostProcessor进⾏后置处
理做⼀些事情
注意:对象不⼀定是springbean,⽽springbean⼀定是个对象
SpringBean的⽣命周期
其中基于注解注入时,BeanDefination就是借助BeanFactoryPostProcessor的实现类ConfigurationClassPostProcessor中的方法实现的。
自定义Bean后置处理器CustomBeanPostProcessor :
@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println(beanName+"===postProcessBeforeInitialization");
return null;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println(beanName+"===postProcessAfterInitialization");
return null;
}
}
在这个过程中我们可以获取到bean对象,可以在这个过程中介入spring对实例初始化的过程,来操作改变bean
注入到spring容器的类City:
@Component
public class City {
public City(){
System.out.println("==================City构造方法=======================");
}
public void test(){
System.out.println(this.hashCode());
}
}
测试类:
public class Test {
@SuppressWarnings("resource")
public static void main(String[] args) {
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
City city = annotationConfigApplicationContext.getBean(City.class);
}
}
执行结果:
==================City构造方法=======================
city===postProcessBeforeInitialization
city===postProcessAfterInitialization
spring源码中也是大量借助后置处理器来完成bean初始化工作的
1.执行InstantiationAwareBeanPostProcessor 的postProcessBeforeInstantiation和postProcessAfterInitialization 在bean没有开始实例化之前执行
2.determineConstructorsFromBeanPostProcessors—SmartInstantiationAwareBeanPostProcessor–determineCandidateConstructors推断构造方法
3.applyMergedBeanDefinitionPostProcessors—MergedBeanDefinitionPostProcessor–postProcessMergedBeanDefinition 缓存注解信息
4.addSingletonFactory —SmartInstantiationAwareBeanPostProcessor—getEarlyBeanReference得到一个体现暴露的对象----对象不是bean(在spring容器当中,并且由sping自己产生的)
5.populateBean-----InstantiationAwareBeanPostProcessor–postProcessAfterInstantiation判断你的bean需不需要完成属性填充
6.populateBean-------- InstantiationAwareBeanPostProcessor—postProcessPropertyValues属性填充—自动注入
7.BeanPostProcessor----postProcessBeforeInitialization 在bean初始方法化前调用
8.BeanPostProcessor----postProcessAfterInitialization在bean初始化方法后调用
9.destory