跳转至

Spring Bean 生命周期

1. 介绍

  理解 Spring bean 的生命周期很容易。当一个 bean 被实例化时,它可能需要执行一些初始化使它转换成可用状态。同样,当 bean 不再需要,并且从容器中移除时,可能需要做一些清除工作。

  尽管还有一些在 Bean 实例化和销毁之间发生的活动,但是本章将只讨论两个重要的生命周期回调方法,它们在 bean 的初始化和销毁的时候是必需的。

  为了定义安装和拆卸一个 bean,我们只要声明带有 init-method 和/或 destroy-method 参数的 。init-method 属性指定一个方法,在实例化 bean 时,立即调用该方法。同样,destroy-method 指定一个方法,只有从容器中移除 bean 之后,才能调用该方法。

  Bean的生命周期可以表达为:Bean的定义——Bean的初始化——Bean的使用——Bean的销毁

2. 操作步骤

在基于 XML 的配置元数据的情况下,你可以使用 init-method 属性来指定带有 void 无参数方法的名称。例如:

Person.class

public void init(){
    System.out.println("Bean is going through init.");
}
public void destroy(){
    System.out.println("Bean will destroy now.");
}

ioc.xml

<bean id="person" class="com.cmz.bean.Person" init-method="init" destroy-method="destroy">
    <property name="id" value="1"></property>
    <property name="name" value="张三"></property>
    <property name="age" value="20"></property>
    <property name="gender" value="男"></property>
    <property name="date" value="2020/02/28"></property>
</bean>

MyTest.class

ApplicationContext context = new ClassPathXmlApplicationContext("ioc.xml");
// 根据bean标签id来获取对象
Person person = context.getBean("person", Person.class);
Person person1 = context.getBean("person", Person.class);
System.out.println(person);
System.out.println(person==person1);
((ClassPathXmlApplicationContext) context).close();

输出

Bean is going through init.
Person{id=1, name='张三', age=20, gender='男', date=Fri Feb 28 00:00:00 CST 2020}
true
Bean will destroy now.

注意

若是 scope="singtone" 初始化和销毁都有,scope="prototype"初始化被调用,而即使你关闭了也不会调用销毁
<bean id="person" class="com.cmz.bean.Person" init-method="init" destroy-method="destroy" scope="prototype">