IOC容器中Bean的生命周期
我们之前讲解过Servlet生命周期,生命周期就是从初始化到销毁的过程,那么我们SpringIOC容器是用来管理bean的,所以又叫做Bean容器或者IOC容器,既然bean是在容器容器中管理的,那么肯定在容器中存在生命周期的过程。之前我们看到了bean的实例化和bean的设置属性到bean的使用,但是这些过程不能够完全的表示bean的生命周期,在Spring中,可以配置bean的初始化和销毁操作。
下面我们通过程序来看一下bean的生命周期
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
System.out.println("调用bean的set方法");
this.name = name;
}
public Person() {
super();
System.out.println("bean被实例化");
}
public Person(String name) {
super();
this.name = name;
System.out.println("bean被实例化");
}
public void init() {
System.out.println("bean被初始化了");
}
public void destory() {
System.out.println("bean被销毁了");
}
@Override
public String toString() {
return "Person [name=" + name + "]";
}
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="person" class="com.nhkj.life.Person" init-method="init" destroy-method="destory">
<!-- <constructor-arg value="阿狸"></constructor-arg> -->
<!--<constructor-arg value="阿狸" index="0"></constructor-arg> -->
<property name="name" value="妲己"></property>
</bean>
</beans>
以上是实体类和spring的配置文件,下面我们来编写测试类
public class Main {
public static void main(String[] args) {
ConfigurableApplicationContext act = new ClassPathXmlApplicationContext("life.xml");
Person person = act.getBean(Person.class);
System.out.println(person);
//关闭容器
act.close();
}
}
程序输出的结果如下:
我们现在可以完整的通过程序运行观察bean的生命周期了:
- bean实例化
- 调用bean的setter方法
- bean初始化
- bean可以使用了
- bean销毁(容器关闭的时候bean进行销毁)
为了更加细致的观察bean的生命周期,我们可以使用bean的后置处理器。
二. bean的后置处理器
BeanPostProcessor这个接口表示的是bean的后置处理器,里面有两个方法:
- Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException 表示在bean初始化方法之前执行
- Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException表示在bean初始化方法之后执行
实现bean的后置处理器:
定义实现类,实现BeanPostProcessor接口,并且复写两个方法
public class MyBeanPostProcessor implements BeanPostProcessor {
/**
* postProcessBeforeInitialization : 在bean初始化方法之前执行
*/
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization.....");
return bean;
}
/**
* postProcessAfterInitialization : 在bean初始化方法之后执行
*/
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization.....");
return bean;
}
}
编写好了之后我们需要进行配置
- 配置bean的后置处理器:当做普通的bean一样配置到IOC容器中
<!-- 后置处理器和普通bean一样配置到IOC容器中 -->
<bean id="beanPostProcessor" class="com.nhkj.life.MyBeanPostProcessor"></bean>
这个时候bean的后置处理器就可以使用了,测试一下,这个时候,bean的生命周期变成了:
- bean实例化
- 调用bean的setter方法
- 执行bean后置处理器的前置方法
- bean初始化
- 执行bean后置处理器的后置方法
- bean可以使用了
- bean销毁(容器关闭的时候bean进行销毁)