当前位置: 首页 > article >正文

@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之前执行的,通常是进行一些清理工作。


http://www.kler.cn/a/15729.html

相关文章:

  • 华为Ensp模拟器配置RIP路由协议
  • 【0x001C】HCI_Write_Page_Scan_Activity详解
  • Vue学习记录03
  • vue3【实战】切换全屏【组件封装】FullScreen.vue
  • c# Encoding.GetEncoding
  • 支持向量机SVM——基于分类问题的监督学习算法
  • 【AI生产力工具】Upscale.media:用AI技术提升照片质量,让你的作品更出色
  • 【LeetCode股票买卖系列:121. 买卖股票的最佳时机 | 一次遍历 | 暴力递归=>记忆化搜索=>动态规划】
  • 系统集成项目管理工程师 笔记(第19章:项目收尾管理)
  • 【5G RRC】RSRP、RSRQ以及SINR含义、计算过程详细介绍
  • 如何在Linkedin领英上找客户
  • VsCode镜像下载(国内镜像源,高速秒下)
  • 博世中国创新软件开发中心 BCSC
  • vue生命周期代码示范--Vue基本介绍--MVVM-示意图--数据渲染--事件绑定--修饰符--组件化--和全部代码示范
  • Python高级函数1:使用 map()、reduce()、filter()、zip() 和 enumerate() 简化代码
  • 【云台】开源版本SimpleBGC的电机驱动与控制方式
  • iVX开发中整理的常见问题与回答(三)
  • 虹科案例 | 如何通过智能、非接触式测量解决方案,提高起重机的安全和效率?
  • ESET NOD32 互联网安全软件和防毒软件 -简单,可靠的防护。
  • 优思学院|做质量管理有七大工具,都是什么?
  • 训练数据集处理
  • SpringMVC实现文件上传和下载和Json的简单实用
  • Promises对象
  • 西瓜书读书笔记整理(三)—— 第二章 模型评估与选择
  • 让你的ChatGPT更加强大——200+小白用来解锁ChatGPT高级功能的提示(Prompts)
  • C/C++的命名空间和调用函数的详细讲解