Spring Bean 生命周期 三种表示方法

来源:互联网 发布:淘宝老顾客回购权重 编辑:程序博客网 时间:2024/05/29 14:02

 文章的索引:

  • 通过接口InitializingBean,DisposableBean实现Bean生命周期。
  • 通过JavaEE注解@PostConstruct,@PreDestroy实现Bean生命周期。
  • 通过配置文件标签属性init-method和destroy-method实现Bean生命周期。

因为演示的需要,首先给出一个普通的bean:

public class SimpleBean {    private String name;    // set 注入    public void setName(String name) {        this.name = name;    }    public String getName() {        return name;    }}

方法一:bean分别实现接口InitializingBean和DisposableBean,并且复写相应的方法afterPropertiesSet和destroy。

import org.springframework.beans.factory.InitializingBean;import org.springframework.beans.factory.DisposableBean;public class SimpleBean implements InitializingBean,DisposableBean {    private String name;    public void setName(String name) {        this.name = name;    }    public String getName() {        return name;    }    @Override    public void afterPropertiesSet() {        System.out.println("属性设置完后执行该方法");    }    @Override    public void destroy() {        System.out.println("结束前执行一些清理工作");    }}

 

在Spring bean配置文件中定义该bean:(配置文件名称为SpringConfig.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-3.0.xsd">   <bean id="simple" class="SimpleBean">       <property name="name" value="I'm a Simple Bean">   </bean></beans>


运行它:

public class App {    public static void main( String[] args )    {    ConfigurableApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"SpringConfig.xml"});     SimpleBean simple = (SimpleBean )context.getBean("simple");     System.out.println(simple.getName());     context.close();    }}


打印结果:

属性设置完后执行该方法I'm a Simple Bean结束前执行一些清理工作

 

********************************************************************************************************************


方法二:利用JavaEE的注解@PostConstruct和@preDestroy。

public class SimpleBean {    private String name;    public void setName(String name) {        this.name = name;    }    public String getName() {        return name;    }    @PostConstruct    public void initIt() {        System.out.println("属性设置完后执行该方法");    }    @PreDestroy    public void destroyIt() {        System.out.println("结束前执行一些清理工作");    }}


为了让Spring容器意识到该注解,需要在配置文件中加上标签<context:annotation-config />。

<?xml version="1.0" encoding="UTF-8"?><beans...>   <context:annotation-config />   <bean id="simple" class="SimpleBean">       <property name="name" value="I'm a Simple Bean">   </bean></beans>


运行它(依然是原来的main方法):


打印结果同上。

 

********************************************************************************************************************

 

方法三:在Spring bean配置文件的bean标签中添加属性init-method和destroy-method。

先看看配置文件:

<?xml version="1.0" encoding="UTF-8"?><beans ...>   <bean id="simple" class="SimpleBean" init-method="myInit" destroy-method="myDestroy">       <property name="name" value="I'm a Simple Bean">   </bean></beans>


配置文件中定义了初始化方法为myInit,销毁方法为myDestroy,以上方法必须为void,且无参数。

修改后的bean如下:

public class SimpleBean {    private String name;    public void setName(String name) {        this.name = name;    }    public String getName() {        return name;    }    public void myInit() {        System.out.println("属性设置完后执行该方法");    }    public void myDestroy() {        System.out.println("结束前执行一些清理工作");    }}


运行它(依然是原来的main方法):

打印结果同上。

如果配置文件中有许多bean,为了减少init-method和destroy-method的数量,可以在根元素(beans)中添加属性default-init-method和default-destroy-method定义所有bean的默认初始化方法和销毁方法。(全局性)

 

<beans default-init-method="init"        default-destroy-method="destroy" ...>   <bean id="..." class="...">       <!-- collaborators and configuration for this bean go here -->   </bean></beans>--------------------------------------------------------------------------------


个人更喜欢第三种方法,因为第三种方法无需依赖其它接口或类(比如InitializingBean和DisposableBean),无需在配置文件中定义标签<context:annotation-config />(针对第二种方法),另外可以自定义自己的方法名字(针对第一种方法)。

 

原创粉丝点击