一、@PostConstruct和@PreConstruct介绍
从JavaEE5规范开始,Servlet增加了两个影响Servlet生命周期的注解(Annotation):@PostConstruct和@PreConstruct。
这两个注解被用来修饰一个非静态的void()方法,而且这个方法不能有抛出异常声明。
二、@PostConstruct的使用
@PostContruct是spring框架的注解,在方法上加该注解会在项目启动的时候执行该方法,也可以理解为在spring容器初始化的时候执行该方法。
2.1 @PostConstruct在项目中的用处
2.1.1 spring项目加载数据字典
@PostConstruct注解的方法在项目启动的时候执行这个方法,也可以理解为在spring容器启动的时候执行,可作为一些数据的常规化加载,比如数据字典之类的。
2.1.2 spring项目的定时任务
spring自带的@schedule,没有开关,项目启动总会启动一个线程;做项目的时候就使用Java的timer,这个设置开关即可自由的控制,关闭的时候,不会启动线程;Java的timer也需要找到一个启动类,可以放到main函数里面启动,这样的话,代码的耦合性太高了,而使用PostConstruct是很干净的。
spring中Constructor、@Autowired、@PostConstruct的顺序
其实从依赖注入的字面意思就可以知道,要将对象p注入到对象a,那么首先就必须得生成对象p与对象a,才能执行注入。
所以,如果一个类A中有个成员变量p被@Autowired注解,那么@Autowired注入是发生在A的构造方法执行完之后的。
如果想在生成对象时候完成某些初始化操作,而偏偏这些初始化操作又依赖于依赖注入,那么就无法在构造函数中实现。
为此,可以使用@PostConstruct注解一个方法来完成初始化,@PostConstruct注解的方法将会在依赖注入完成后被自动调用。
Constructor >> @Autowired >> @PostConstruct
2.2 特点:
- 只有非静态方法能使用此注解
- 被注解的方法不得有任何参数
- 被注解的方法返回值必须为void
- 被注解方法不得抛出已检查异常
- 此方法只会被执行一次
2.3 使用
@PostConstruct public void someMethod(){}
或者
public @PostConstruct void someMethod(){}
被@PostConstruct修饰的方法会在服务器加载Servle的时候运行,并且只会被服务器执行一次。
@PostConstruct在构造函数之后执行,init()方法之前执行。PreDestroy()方法在destroy()方法执行执行之后执行!
被注解的Servlet生命周期
需要注意的是,注解会多多少少地影响到服务器的启动速度。
服务器在启动时候会遍历Web应用的WEB-INF/classes下的所有class文件与WEB-INF/lib下的所有jar文件,以检查哪些类使用了注解。
如果应用程序中没有使用任何注解,可以在Web.xml中设置的metadata-complete属性为true。
(支持@PostConstruct和 @PreDestroy的服务器需要支持Servlet2.5规范。Tomcat5.x仅支持Servlet2.4规范。)
三、@PreDestroy注解使用
在开发中我们如果要在关闭spring容器后释放一些资源,通常的做法有如下几种:
1.在方法上加上@PreDestroy注解
2.实现DisposableBean接口,实现其destroy方法
3.1 使用场景
可以在bean实例被销毁时,做一些清理工作,比如关闭一些数据库或者网络的连接,记录一些系统关闭的日志信息等。
执行时机
(1)Servlet中:在Servlet被服务器卸载的时候执行,并且只会执行一次,被该注解修饰的方法会在Servlet的destroy方法执行之后,在Servlet被彻底卸载完成之前执行。
(2)Spring中:在Spring发布容器关闭事件之后,在执行Bean的destroy方法之前执行。
3.2 @PreDestroy使用示例
例:在容器关闭的时候,删除系统缓存的和用户信息相关的缓存文件
标注在一个非静态的void方法上,而且被标注的方法不能声明抛出异常:
点击查看代码
@Service
public class UserService {
@PreDestroy
public void destroyUserService() {
// 可以在该步骤中清理系统的缓存文件
FileUtils.clearAllUserCacheFile();
System.out.println("context close...");
}
}