@PostConstruct注解和@PreDestroy注解
前言
@Bean注解指定初始化和销毁的方法,也介绍了使用InitializingBean和DisposableBean来处理bean的初始化和销毁。JDK中还提供了两个注解能够在bean创建完成并且属性赋值完成之后执行一些初始化工作和在容器销毁bean之前通知我们进行一些清理工作。
1.@PostConstruct注解和@PreDestroy注解
1.1.@PostConstruct注解
@PostConstruct它是Java自己的注解,是JSR-250规范里面定义的一个注解。
@PostConstruct注解的源码,如下所示。
package javax.annotation;
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;
@Documented
@Retention (RUNTIME)
@Target(METHOD)
public @interface PostConstruct {
}
从源码可以看出,@PostConstruct注解是Java中的注解,并不是Spring提供的注解
@PostConstruct注解被用来修饰一个非静态的void()方法。被@PostConstruct注解修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。被@PostConstruct注解修饰的方法通常在构造函数之后,init()方法之前执行。
通常我们是会在Spring框架中使用到@PostConstruct注解的,该注解的方法在整个bean初始化中的执行顺序如下:
Constructor(构造方法)→@Autowired(依赖注入)→@PostConstruct(注释的方法)
1.2.@PreDestroy注解
@PreDestroy注解同样是Java提供的,它也是JSR-250规范里面定义的一个注解。看下它的源码,如下所示。
package javax.annotation;
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;
@Documented
@Retention (RUNTIME)
@Target(METHOD)
public @interface PreDestroy {
}
被@PreDestroy注解修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreDestroy注解修饰的方法会在destroy()方法之后,Servlet被彻底卸载之前执行。执行顺序如下所示:
调用destroy()方法→@PreDestroy→destroy()方法→bean销毁
1.3.小结
@PostConstruct和@PreDestroy是Java规范JSR-250引入的注解,定义了对象的创建和销毁工作,同一期规范中还有@Resource注解,Spring也支持了这些注解。
2.案例
创建一个Dog类,如下所示
package com.tianxia.springannotation.entity;
import lombok.Data;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.io.Serializable;
/**
* @author liqb
* @date 2023-04-28 10:27
**/
@Data
public class Dog implements Serializable {
public Dog() {
System.out.println("dog constructor...");
}
/**
* 在对象创建完成并且属性赋值完成之后调用
* @author liqb
* @date 2023-04-28 10:28
*/
@PostConstruct
public void init() {
System.out.println("dog...@PostConstruct...");
}
/**
* 在容器销毁(移除)对象之前调用
* @author liqb
* @date 2023-04-28 10:28
*/
@PreDestroy
public void destory() {
System.out.println("dog...@PreDestroy...");
}
}
在Dog类中,提供了构造方法、init()方法以及destroy()方法,还使用了@PostConstruct注解和@PreDestroy注解来分别标注init()方法和destroy()方法。
在MainConfigOfLifeCycle配置类中配置Dog的bean对象
/**
* 创建dog的bean对象
* @author liqb
* @date 2023-04-27 11:53
* @return
*/
@Bean
public Dog dog() {
return new Dog();
}
运行测试方法,输出的结果信息如下所示
@Test
public void test01() {
// 1. 创建IOC容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
// 关闭容器
applicationContext.close();
}
从输出的结果信息中可以看出,被@PostConstruct注解修饰的方法是在bean创建完成并且属性赋值完成之后才执行的,而被@PreDestroy注解修饰的方法是在容器销毁bean之前执行的,通常是进行一些清理工作。