简介:
在spring世界中,一切皆为bean,spring是面向bean编程的,bean也可以称为组件,是一个个java对象,多个组件间协调工作完成复杂的业务功能。
所以理解bean的生命周期,方便在每个时期可以执行一些特定的操作是十分重要的。
这里的bean指的是单例bean,原型bean一旦从容器中获取出去生命周期就不归容器管理了。
默认的生命周期:
spring中bean有五个默认的生命周期(顺序由上到下):
- 实例创建阶段:就是使用构造器进行实例创建的阶段。
- 依赖注入阶段:也就是属性赋值阶段。
- 初始化阶段:可以在依赖注入结束后执行指定的初始化方法。
- 使用阶段:bean正常使用。
- 销毁阶段:bean从容器中移除或者容器销毁或者关闭时可以执行特性的方法。
demo:
package com.cong.springdemo;
public class Person {
private String name;
private Integer age;
public Person() {
System.out.println("第一步:创建实例");
}
public String getName() {
return name;
}
public void setName(String name) {
System.out.println("第二步:依赖注入阶段");
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "第四步:使用阶段:Person [name=" + name + ", age=" + age + "]";
}
//初始化方法,会在依赖注入结束后由调用
public void init() {
System.out.println("第三步:初始化");
}
//销毁方法。会在bean从容器中移除或者容器销毁或者关闭时执行。
public void destroy() {
System.out.println("第五步:销毁");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<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">
<!-- 使用 init-method执行初始化方法 ,使用destroy-method指定销毁方法-->
<bean id="person1" class="com.cong.springdemo.Person" init-method="init" destroy-method="destroy">
<property name="name" value="Tom"></property>
<property name="age" value="18"></property>
</bean>
</beans>
测试:
public class Test {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Person person = (Person) context.getBean("person1");
System.out.println(person);
//关闭容器
context.close();
}
}
执行结果:
除了在xml指定初始化方法和销毁方法,还可以让类实现InitializingBean接口并重写初始化方法,实现DisposableBean方法重写销毁方法实现一样的事情。
基于后置处理器BeanPostProcessor的生命周期
可以定义一个后置处理器实现BeanPostProcessor并重写里面的两个方法,可以在bean的默认生命周期中多加两个时期,一个是在依赖注入后,初始化方法执行前,一个是在初始化方法执行后执行。
这就可以实现生命周期的七个时期(顺序由上到下):
- 实例创建阶段:就是使用构造器进行实例创建的阶段。
- 依赖注入阶段:也就是属性赋值阶段。
- 后置处理器实现的时期。
- 初始化阶段:可以在依赖注入结束后执行指定的初始化方法。
- 后置处理器实现的时期。
- 使用阶段:bean正常使用。
- 销毁阶段:bean从容器中移除或者容器销毁或者关闭时可以执行特性的方法。
demo:
public class MyPostProcess implements BeanPostProcessor{
//会在bean的初始化方法之后执行
@Override
/**
* bean:要处理的bean,必须返回这个,供后面的生命周期使用。
* beanName:bean id
*/
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("第五步:后置处理器在初始化后执行");
return bean;
}
//会在bean的初始化方法之前执行
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("第三步:后置处理器在初始化前执行");
return bean;
}
}
public class Person{
private String name;
private Integer age;
public Person() {
System.out.println("第一步:创建实例");
}
public String getName() {
return name;
}
public void setName(String name) {
System.out.println("第二步:依赖注入阶段");
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "第六步:使用阶段:Person [name=" + name + ", age=" + age + "]";
}
//初始化方法,会在依赖注入结束后由调用
public void init() {
System.out.println("第四步:初始化");
}
//销毁方法。会在bean从容器中移除或者容器销毁或者关闭时执行。
public void destroy() {
System.out.println("第七步:销毁");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<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">
<!-- 使用 init-method执行初始化方法 ,使用destroy-method指定销毁方法-->
<bean id="person1" class="com.cong.springdemo.Person" init-method="init" destroy-method="destroy">
<property name="name" value="Tom"></property>
<property name="age" value="18"></property>
</bean>
<!-- 后置处理器也要创建实例bean -->
<bean class="com.cong.springdemo.MyPostProcess"></bean>
</beans>
测试:
public class Test {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Person person = (Person) context.getBean("person1");
System.out.println(person);
//关闭容器
context.close();
}
}
结果:
**总结:**要了解spring 容器bean的生命周期,使得可以在每个时期做一些特定是事情。