InitializingBean和BeanPostProcess都是Spring提供的接口
区别:
1、BeanPostProcess先于InitializingBean执行
2、InitializingBean是在对象已经实例化之后,执行接口的afterPropertiesSet()方法;
BeanPostProcess是在bean构建的过程中,postProcessBeforeInitialization,postProcessAfterInitialization
注意:每个bean在构建的过程中,Spring都会遍历所有的BeanPostProcessor的实现类,调用实现类中的方法,入参为构建好的bean
3、自己实现BeanPostProcess接口时,如果想生效,还需将实现类构建成SpringBean
即需要用@Component注解 等方法
执行顺序
类构造方法 - postProcessBeforeInitialization - @PostConstruct注解的方法 - InitializingBean的afterPropertiesSet()方法 - postProcessAfterInitialization
测试代码如下:
@Component
public class TestInitOrder implements InitializingBean {
public TestInitOrder() {
System.out.println("TestInitOrder construct");
}
@PostConstruct
public void testPostConstruct() {
System.out.println("testPostConstruct");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("afterPropertiesSet");
}
}
@Component
public class TestBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (beanName.contains("testInitOrder")) {
System.out.println("TestInitOrder postProcessBeforeInitialization");
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (beanName.contains("testInitOrder")) {
System.out.println("TestInitOrder postProcessAfterInitialization");
}
return bean;
}
}
调用链路
BeanPostProcess接口调用链路如下:
自己创建BeanPostProcessor实现类
InitializingBean接口调用链路如下:
由调用链路看出,执行的方法先后顺序