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

 文章的索引:

  • 通过接口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 />(针对第二种方法),另外可以自定义自己的方法名字(针对第一种方法)。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值