这一节准备给大家讲解Spring 容器中的Bean的生命周期。这一节我个人觉得还是比较实用的,在实际工作当中经常会用到这些知识来解决一些非常棘手的问题。
ApplicationContext中Bean的生命周期
先来张图:
大家看到这张图肯定是一脸蒙蔽。不要着急,我来慢慢解释:从getBean(…)为触发点,Spring容器的Bean生命周期就经历了图中的生命周期,先分个类:
-
图中绿色箭头的三个步骤(InstantiationAwareBeanPostProcessor)和粉红色箭头的两个步骤(BeanPostProcessor)为容器级的生命周期接口,当Spring每加载任何一个Bean到容器中时,这些接口都会起到如图中的几次调用。这两个处理器叫做"容器级后处理器",他们的影响是全局的,能够影响所有的Bean.
-
图中大红色圆圈圈住的接口叫做"工厂级后处理器",类似的接口还有CustomEditorConfigurer,PropertyPlaceholderConfigurer等,这类接口只在上下文初始化的时候调用一次,其目的是完成一些配置文件的加工处理工作。
-
剩下的就简单了,属于Bean级别的接口,专属于某个Bean所有,每个Bean实例化的时候调用自己特有的。
值得一提的是,无论是"容器级后处理器"还是"工厂级后处理器",他们都是可以配置多个的(如,配置两个BeanPostProcessor),如果想控制他们的调用顺序,实现一个org.springframework.core.Ordered接口即可。当然了,一般不用,一般一类后处理器只有一个即可。
重点强调!:
这些接口的调用顺序并不是一尘不变的,会随便Spring的版本变动而变动,大家要做的是万变不离其宗,知道能够通过这些接口在Bean初始化的时做一些属性上的操作。调用顺序要根据具体的版本来自己测试。下面我会给大家来列一个例子:
public class Student implements BeanFactoryAware, BeanNameAware,
InitializingBean, DisposableBean,ApplicationContextAware {
private String name;
public Student(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("BeanFactoryAware......");
}
@Override
public void setB