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; }}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结束前执行一些清理工作
********************************************************************************************************************
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 />(针对第二种方法),另外可以自定义自己的方法名字(针对第一种方法)。