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