Spring Bean 生命周期

Posted 爱吃西瓜的番茄酱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Bean 生命周期相关的知识,希望对你有一定的参考价值。

Bean 的生命周期

为了定义安装和拆卸一个 bean,我们只要声明带有 init-method 和或 destroy-method 参数。

init-method 属性指定一个方法,在实例化 bean 时,立即调用该方法。

同样,destroy-method 指定一个方法,只有从容器中移除 bean 之后,才能调用该方法。

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

在基于 XML 的配置元数据的情况下, 声明init 和 destroy 方法如下:

  <bean id="helloWorld" 
       class="hello.HelloWorld"
       init-method="init" destroy-method="destroy">
       <property name="message" value="Hello World!"/>
   </bean>

一个示例

先建一个Spring项目,参考在IDEA中使用Spring写一个HelloWorld

这是 HelloWorld.java 的文件的内容

package hello;

public class HelloWorld {
    private String message;
    public void setMessage(String message){
        this.message  = message;
    }
    public void getMessage(){
        System.out.println("Your Message : " + message);
    }
    public void init(){
        System.out.println("Bean is going through init.");
    }
    public void destroy(){
        System.out.println("Bean will destroy now.");
    }
}

下面是 MainApp.java 文件的内容。

在这里,你需要注册一个在 AbstractApplicationContext 类中声明的关闭 hook 的 registerShutdownHook() 方法。它将确保正常关闭,并且调用相关的 destroy 方法。

package hello;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class MainApp {
    public static void main(String[] args) {
         AbstractApplicationContext context =
                new ClassPathXmlApplicationContext("Beans.xml");
        HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
        obj.getMessage();
        context.registerShutdownHook();
    }
}

下面是 init 和 destroy 方法必需的配置文件 Beans.xml 文件:

<?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">

    <bean id="helloWorld" class="hello.HelloWorld" init-method="init" destroy-method="destroy">
        <property name="message" value="你好,Spring!"/>
    </bean>

</beans>

运行MainApp.java,结果如下:

Bean is going through init.
Your Message : 你好,Spring!
Bean will destroy now.

默认的初始化和销毁方法

如果你有太多具有相同名称的初始化或者销毁方法的 Bean,那么你不需要在每一个 bean 上声明初始化方法和销毁方法。

框架使用元素中的 default-init-methoddefault-destroy-method 属性提供了灵活地配置这种情况,如下所示:

<?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"
       default-init-method="init"
       default-destroy-method="destroy">

    <bean id="helloWorld" class="hello.HelloWorld" >
        <property name="message" value="你好,Spring!"/>
    </bean>

</beans>

运行结果和前面相同。

每天学习一点点,每天进步一点点。

以上是关于Spring Bean 生命周期的主要内容,如果未能解决你的问题,请参考以下文章

Spring事务,Bean生命周期

Spring应用上下文中Bean的生命周期

Spring课程 Spring入门篇 3-2 Spring bean装配(上)之bean的生命周期

Spring Bean的生命周期

Spring之bean的生命周期

Spring 的 Bean 生命周期,11 张高清流程图及代码,深度解析