对于一个类(TestBean2)实现了BeanPostProcessor接口,另外一个类(TestBean)实现了InitializingBean接口。当执行的时候对于TestBean这个bean,它的postProcessBeforeInitialization方法会先执行,然后是afterPropertiesSet方法执行,最后是postProcessAfterInitialization方法执行
@Component
public class TestBean implements InitializingBean{
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("TestBean.afterPropertiesSet---------");
}
}
@Component
public class TestBean2 implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if("testBean".equals(beanName)){
System.out.println(beanName+".postProcessBeforeInitialization-----");
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if("testBean".equals(beanName)){
System.out.println(beanName+".postProcessAfterInitialization-----");
}
return bean;
}
}
执行结果
但如果一个类同时实现了BeanPostProcessor和InitializingBean,那么执行的时候会发现这个类的afterPropertiesSet方法先执行,然后再是postProcessBeforeInitialization执行,最后是postProcessAfterInitialization执行
@Component
public class TestBean3 implements BeanPostProcessor, InitializingBean {
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("TestBean3.afterPropertiesSet-----------------");
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("TestBean3.postProcessBeforeInitialization-----------------");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("TestBean3.postProcessAfterInitialization-----------------");
return bean;
}
}
原因就在于,spring启动的时候会先对实现了BeanPostProcessor接口的bean进行实例化和初始化,所以会导致TestBean3这个bean的afterPropertiesSet方法先执行;等对实现了BeanPostProcessor接口的bean初始化完成了才会接着对其它的bean进行实例化和初始化,这也就导致了TestBean3的postProcessBeforeInitialization因为spring要对其它的bean进行初始化了而触发了执行,而对TestBean3的初始化不会导致postProcessBeforeInitialization的执行。