1. @PostConstruct

1.1 概述

@PostConstruct标记在方法上,在当前类的实例加入到容器之前,会先执行@PostConstruct标记的方法。它的执行顺序是这样的:

  • 先执行当前类的构造函数
  • 然后执行@Autowired标记对象的初始化
  • 最后执行@PostConstruct标记的方法
  • 如果没有抛出异常,则该对象加入Spring管理容器

1.2 验证执行顺序

创建一个空的Spring Boot项目,这步不演示了

创建TestComponent

@Component
public class TestComponent {public TestComponent(){System.out.println("TestComponent 构造函数");}@PostConstructpublic void init(){System.out.println("TestComponent PostConstruct");}
}

创建MyService

public interface MyService {void Hello(String name);
}

创建MyServiceImpl

@Service
public class MyServiceImpl implements MyService {public MyServiceImpl(){System.out.println("MyServiceImpl 构造函数");}@PostConstructpublic void init(){System.out.println("MyServiceImpl PostConstruct");}@Overridepublic void Hello(String name) {System.out.println("Hello " + name);}
}

运行项目,看下输出结果。
TestComponent和MyServiceImpl分别独自初始化,构造函数优先执行
请记住这个执行顺序

TestComponent 构造函数
TestComponent PostConstruct
MyServiceImpl 构造函数
MyServiceImpl PostConstruct

还没完,改一下TestComponent,加入引用MyService

    @Autowiredprivate MyService myService;

再执行一下,看看结果有什么变化

TestComponent 构造函数
MyServiceImpl 构造函数
MyServiceImpl PostConstruct
TestComponent PostConstruct

MyServiceImpl执行顺序往前移动了,证明@Autowired顺序在@PostConstruct之前

因此,如果要在TestComponent初始化的时候调用MyService方法,要写在@PostConstruct内部,不能在构造函数处理(这时候MyServiceImpl还没初始化,会抛出空指针异常)

@Component
public class TestComponent {@Autowiredprivate MyService myService;public TestComponent(){System.out.println("TestComponent 构造函数");//写在这里必定抛出异常,此时 myService == null//myService.Hello("张三");}@PostConstructpublic void init(){System.out.println("TestComponent PostConstruct");//在这里调用MySerice方法才正确myService.Hello("张三");}
}

2. @PreDestroy

首先,来看下Java Doc对这个注解的说明


1: 在对象实例被容器移除的时候,会回调调用@PreDestroy标记的方法
2: 通常用来释放该实例占用的资源

修改上面的TestComponent代码,加上@PreDestroy代码

    @PreDestroypublic void destroy(){System.out.println("TestComponent 对象被销毁了");}

修改Application main方法,启动10秒后退出程序

@SpringBootApplication
public class AnnotationTestApplication {public static void main(String[] args) {ConfigurableApplicationContext ctx = SpringApplication.run(AnnotationTestApplication.class, args);try {Thread.sleep(10 * 1000);} catch (InterruptedException e) {e.printStackTrace();}ctx.close();}
}

启动程序,查看输出信息
程序退出时会销毁对象,所以会触发我们刚写的@PreDestroy方法,测试通过。

SpringBoot @PostConstruct和@PreDestroy使用详解相关推荐

  1. SpringBoot整合Log4j2以及配置详解

    文章目录 标题SpringBoot整合Log4j2以及配置详解 1.加入依赖 2.在src.java.main.resources目录下创建log4j2.xml文件 log4j2.xml文件内容如下: ...

  2. SpringBoot - 获取Get请求参数详解(附样例:非空、默认值、数组、对象)

    利用 Spring Boot 来制作 Web 应用,就必定会涉及到前端与后台之间互相传递参数.下面演示 Controller 如何接收以 GET 方式传递过来的参数. 一.参数直接在路径中 (1)假设 ...

  3. SpringBoot 获取 Get 请求参数详解

    叙述 利用 Spring Boot 来制作 Web 应用,就必定会涉及到前端与后台之间互相传递参数. 下面演示 Controller 如何接收以 GET 方式传递过来的参数. 解决方案 参数直接在路径 ...

  4. springboot aop的execution 表达式详解

    Aspectj切入点语法定义 在使用spring框架配置AOP的时候,不管是通过XML配置文件还是注解的方式都需要定义pointcut"切入点" 例如定义切入点表达式  execu ...

  5. Springboot使用Log4j2的配置详解

    Springboot使用Log4j2的配置 日志框架的对比和选择 一.依赖配置(pom文件) 二.log4j2.xml文件的配置 三.Log4j2.xml配置文件核心概念解析 1.全局Property ...

  6. springboot 集成redis_一文详解Spring Boot 集成 Redis

    redis设置: 修改redis服务器的配置文件 vim /usr/local/redis/bin/redis.confbind 0.0.0.0 protected-mode no 重新启动redis ...

  7. SpringBoot—CORS跨域问题详解和解决方案

    关注微信公众号:CodingTechWork,一起学习进步. 引言   在前后端开发过程中,遇到过一种错误,类似于报错: Access to XMLHttpRequest at 'http://127 ...

  8. springboot拦截器与过滤器详解

    前言 不管是传统的ssm项目,还是springboot项目,拦截器和过滤器在项目开发中都离不开,比如说对于ssm框架类的项目来说,许多登录逻辑的前置校验,黑白名单的检查,以及部分请求的数据分析等依然需 ...

  9. 一起来看看SpringBoot蓝天幼儿园管理系统(详解)

    项目介绍 蓝天幼儿园管理系统,共分为三种角色: 管理员 家长 教师 管理员角色具有功能: 系统管理:用户管理.页面管理.角色管理 校园管理:老师管理.工资管理.物资管理.菜谱管理.班级管理 班级管理: ...

最新文章

  1. Java工具类-转换字符编码
  2. 编写一个程序,它从标准输入(终端)读取C源代码,并验证所有的花括号都正确的成对出现。...
  3. 【转】Apache配置中ProxyPassReverse指令的含义
  4. 服务器市场步步为营:Intel发布新款至强Xeon E5-4600v4四路处理器
  5. move函数c语言,C++11 move()函数:将左值强制转换为右值
  6. Firefox 65.0.2 发布,Firefox 66 预计3月19日推出
  7. LDA-math-神奇的Gamma函数
  8. LAMP(4)Apach和php结合、Apache默认虚拟主机
  9. [react] 说说你对Error Boundaries的理解
  10. kafka是存储到本地磁盘么_Kafka 中的消息存储在磁盘上的目录布局是怎样的?
  11. 数据结构排序1-冒泡,选择,插入排序
  12. 输入法相关的使用(跳转)
  13. eds能谱图分析实例_SPC控制图公式_均值极差SPC控制图公式应用实例分析
  14. C语言-字符型数据与ASCII码表
  15. mysql pxc集群介绍_MySQL中PXC集群的介绍
  16. mysql卸载安装pxc_PXC安装
  17. Excel如何批量插入删除复选框
  18. 词性标注 python
  19. 基于Web的文件管理系统,支持Office、WPS预览/编辑、在线解压缩、文件分享、文件加密、远程存储、远程文件推送、秒传、断点
  20. AWK详解 什么是AWK

热门文章

  1. 采购交货期延误的原因分析
  2. 物料评估类型视图扩充
  3. ABAP--Smart Forms多语言翻译
  4. SAP系统配置常用命令大全
  5. 会计核算方法的组成及联系
  6. 不懂规矩站错位置,“代币”谄媚“区块链”逼于无奈
  7. pandas读取html并排序,使用pandas怎么实现按照列的值进行排序
  8. php pcntl扩展下载,linux下如何安装PHP pcntl 扩展
  9. python grpc 并发_用Python进行gRPC接口测试(二)
  10. 太阳的光和灯光有什么区别_墙体彩绘机UV(油性)和水性墨水怎么选择?有什么区别?...