Spring注解之生命周期@PostConstruct和@PreDestroy

****### 简介
从Java EE5规范开始,Servlet增加了两个影响Servlet生命周期的注解(Annotation):@PostConstruct和@PreConstruct
这两个注解被用来修饰一个非静态的void()方法,而且这个方法不能有抛出异常声明。

Servlet生命周期

image

需要注意的是,注解会多多少少地影响到服务器的启动速度。
服务器在启动时候会遍历Web 应用的WEB-INF/classes下的所有class文件与WEB-INF/lib下的所有jar文件,以及检查哪些类使用了注解。如果应用程序中没有使用任何注解,可以在Web.xml中设置的metadata-complete属性为true.(支持@PostConstruct和 @PreDestroy的服务器需要支持Servlet2.5规范。Tomcat5.x仅支持Servlet2.4规范。)

  • @PostConstruct:在bean创建完成并且属性赋值完成之后来执行初始化方法;

  • @PreDestroy:在容器销毁bean之前执行的方法,例如一些清理工作,关流等;

@PostContruct注解

@PostContruct是spring框架的注解,在方法上加该注解会在项目启动的时候执行该方法,也可以理解为在spring容器初始化的时候执行该方法。可作为一些数据的常规化加载,比如数据字典之类的。

@PostConstruct在项目中的用处

1、spring项目加载数据字典

可作为一些数据的常规化加载,比如数据字典之类的。

2、spring项目的定时任务

spring自带的@schedule,没有开关,项目启动总会启动一个线程;
做项目的时候就使用Java的timer,这个设置开关即可自由的控制,关闭的时候,不会启动线程;
Java的timer也需要找到一个启动类,可以放到main函数里面启动,这样的话,代码的耦合性太高了,而使用PostConstruct是很干净的。

@Autowired和@PostConstruct的顺序

Constructor >> @Autowired >> @PostConstruct

@PostConstruct特点

1、只有一个非静态方法能使用此注解
2、被注解的方法不得有任何参数
3、被注解的方法返回值必须为void
4、被注解方法不得抛出已检查异常
5、此方法只会被执行一次

@PostConstruct的使用

// 方式1
@PostConstruct
public void someMethod() {
    // 加载数据字典
}
// 方式2
public @PostConstruct void someMethod(){
    // 启动线程
}

@PreDestroy注解

被@PreDestroy修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。

被@PreDestroy修饰的方法会在destroy()方法之后运行在Servlet被彻底卸载之前

@PreDestroy的使用

@PreDestroy
public void destroy()
{
    // 关闭任务线程池
}
posted @ 2022-09-27 16:25  空还是空  阅读(353)  评论(0编辑  收藏  举报