简述
Spring对对象生命周期的依次分为:
- 对象的
创建
(Construct) - 对象的
初始化
前(BeforeInit) - 对象
创建之后
(PostConstruct) - 对象的
初始化
(Init) - 对象的
初始化
后(AfterInit) - 对象
销毁
前(PreDestroy) - 对象的
销毁
(Destroy)
如果是单例的对象:
- 在容器启动的时候调用构造方法创建对象。
- 在容器关闭的时候调用销毁方法销毁对象。
如果是多例的对象:
- 每次调用的时候调用构造方法创建对象。
- 容器不会管理这个bean;容器不会调用销毁方法;
下面具体介绍,如何使用spring来对对象的各个生命周期进行管理。
自定义初始化和销毁方法
通过xml
<bean id="user" class="com.going.spring.bean.User" init-method="init" destroy-method="destroy">
<property name="age" value="1"></property>
<property name="name" value="doyoung"></property>
<property name="nickName" value="doyoungdy"></property>
</bean>
通过接口
对象需要实现InitializingBean的afterPropertiesSet方法和DisposableBean的destroy方法
public class User implements InitializingBean,DisposableBean{
......
public void destroy() {
System.out.println("user destory");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("user afterPropertiesSet");
}
......
}
通过注解
// 给容器中注册一个Bean;类型为返回值的类型,id默认是用方法名作为id
@Bean(initMethod = "init", destroyMethod = "destroy")
public UserAnno userAnno() {
return new UserAnno("doyoung", 20, "doyoungdy");
}
问题
当对象不但配置了xml和接口的情况下会出现什么情况呢?
通过测试会发现:
- 当xml的init-method为afterPropertiesSet方法时,或destroy-method为destory方法时,
只会调用一次
。 - 当xml的init-method不为afterPropertiesSet方法时,或destroy-method不为destory方法时,
先调接口的方法再调用xml配置的方法
。
实现对象的初始化前后的控制
了为实现对对象初始化前后的控制,需要实现一个BeanPostProcessor接口,即在接口InitializingBean
的afterPropertiesSet
方法前后执行,或在xml中对对象的init-method
配置的方法前后执行。
(如果有配置注解PostConstruct,它将在PostConstruct之前执行
)该接口具体定义如下:
package org.springframework.beans.factory.config;
import org.springframework.beans.BeansException;
public interface BeanPostProcessor {
/** 对对象的初始化前的控制*/
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
/** 对对象的初始化后的控制*/
Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}
我们也可以看到spring实现了很多的BeanPostProcessor,来实现对象生命周期的管理。

实现对象构造后及销毁前的控制
对这两个结点的控制实际是为了实现对JSR250
的支持。通过使用注解:
@PostConstruct:在对象创建完成并且属性赋值完成,通过调用注解标注的方法完成其它工作。
@PreDestroy:在容器销毁bean之前,通过调用注解标注的方法对对象进行清理工作。
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
......
@PostConstruct
public void postConstruct() {
System.out.println("user PostConstruct");
}
@PreDestroy
public void preDestroy() {
System.out.println("user PreDestroy");
}
网友评论