1.Bean的初始化(InitializingBean)
早期的spring xml形式,如果配置bean的时候,写法如下
<bean id = "beanId" class="全限定名" init-method="abc"></bean>
上面的意思是如果有这样一个类,那么当这个类中所有的属性都赋值完毕之后,则会调用该类的abc方法
public class A{
@Resource
public B b;
public void abc(){
System.out.println("属性B已被填充完毕,执行初始化方法abc");
}
}
后来xml形式逐渐被淘汰了,我们可以使用实现InitializingBean
接口的方法设置初始化方法,代码就变成了下面这样
public class A implements InitializingBean{
@Resource
public B b;
// 顾名思义,在类A的所有属性填充完毕之后(本类的只有1个属性b)
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("属性B已被填充完毕,执行初始化方法abc");
}
}
上述的afterPropertiesSet
就叫做初始化方法,初始化方法一定是在属性填充完毕之后才执行的,这也叫Bean的初始化(指的就是执行这方法)
2.Bean的初始化前后处理(BeanPostProcessor)
如果想在Bean的初始化之前做一些事情,之后再做一些事情,则需要实现BeanPostProcessor接口
@Component
public class MyPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("初始化方法afterPropertiesSet之前执行");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("初始化方法afterPropertiesSet之后执行");
return bean;
}
}
注意:假如一个类C没有实现InitializingBean接口,那么理论上C是没有初始化方法的,但这并不妨碍BeanPostProcessor挂载到这个类C上,这个时候会在类C的所有属性初始化之后,直接调用postProcessBeforeInitialization
方法,综上所属,我们可以假装认为这个类C存在一个空的初始化方法,这样就好理解了
进一步得出结论:如果有一个类实现了BeanPostProcessor,那么spring容器中所有的bean都会执行BeanPostProcessor接口里的那两个方法,而如果一个类实现了InitalizingBean,那么该类自己实例化的时候,会执行InitalizingBean接口里的方法,而不影响其他bean的流程
顺序
1.BeanPostProcess before
2.InitalizingBean after
3.BeanPostProcess after