在java的实际开发过程中,我们可能需要在spring实例化一个bean的过程中,使用到初始化一个对象(bean)后立即初始化(加载)一些数据,或者在销毁一个对象之前进行执行一些事情等等。
因此Spring为我们提供了一系列的方式:
| 方式 | 初始化 init | 销毁destroy |
|---|---|---|
| 1 | @bean 注解,指定属性initMethod | @bean 注解,指定属性destroyMethod |
| 2 | xml形式,指定 init-method | xml形式,指定 destroy-method |
| 3 | 实现InitializingBean接口,重写afterPropertiesSet方法 | 实现DisposableBean接口,重写destroy方法 |
| 4 | 注解@PostConstruct | 注解@PreDestroy |
- @bean 注解
@Bean(name="user",initMethod = "init",destroyMethod = "destroy")
public User user(String name) {
return new User(name);
}
- xml形式
- 接口InitializingBean和DisposableBean
实现InitializingBean接口,重写afterPropertiesSet()方法
public interface InitializingBean {
void afterPropertiesSet() throws Exception;
}
实现DisposableBean方法,重写destroy方法
public interface DisposableBean {
void destroy() throws Exception;
}
- @PostConstruct和@PreDestroy
//初始化后执行的方法,必须为voidlei'xing类型
@PostConstruct
public void init() {
***do someThing
}
//bean销毁前执行的方法
@PreDestroy
public void init() {
***do someThing
}
从Java EE 5规范开始,Servlet中增加了两个影响Servlet生命周期的注解:@PostConstruct和@PreDestroy。
被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Serclet的inti()方法。被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行。
被@PreDestroy修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreDestroy修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前。
一)对Spring版本的要求
-
xml和实现接口的方式是Spring最原始的方式,Spring任何版本均支持
-
@PostConstruct和@PreDestroy需要Spring2.5及以上版本
-
@bean :需要Spring 3.0以上版本支持
二)执行顺序不一样
其中
此处引入Spring中bean生命周期的介绍
引自: 深究Spring中Bean的生命周期.
初始化之后执行顺序: @PostConstruct > InitializingBean > Beaninit-method(xml注解或者@Bean)
销毁之前执行顺序:@preDestroy > DisposableBean > destoryMethod(xml注解或者@Bean)



