SpringBoot @PostConstruct和@PreDestroy使用详解
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使用详解相关推荐
- SpringBoot整合Log4j2以及配置详解
文章目录 标题SpringBoot整合Log4j2以及配置详解 1.加入依赖 2.在src.java.main.resources目录下创建log4j2.xml文件 log4j2.xml文件内容如下: ...
- SpringBoot - 获取Get请求参数详解(附样例:非空、默认值、数组、对象)
利用 Spring Boot 来制作 Web 应用,就必定会涉及到前端与后台之间互相传递参数.下面演示 Controller 如何接收以 GET 方式传递过来的参数. 一.参数直接在路径中 (1)假设 ...
- SpringBoot 获取 Get 请求参数详解
叙述 利用 Spring Boot 来制作 Web 应用,就必定会涉及到前端与后台之间互相传递参数. 下面演示 Controller 如何接收以 GET 方式传递过来的参数. 解决方案 参数直接在路径 ...
- springboot aop的execution 表达式详解
Aspectj切入点语法定义 在使用spring框架配置AOP的时候,不管是通过XML配置文件还是注解的方式都需要定义pointcut"切入点" 例如定义切入点表达式 execu ...
- Springboot使用Log4j2的配置详解
Springboot使用Log4j2的配置 日志框架的对比和选择 一.依赖配置(pom文件) 二.log4j2.xml文件的配置 三.Log4j2.xml配置文件核心概念解析 1.全局Property ...
- springboot 集成redis_一文详解Spring Boot 集成 Redis
redis设置: 修改redis服务器的配置文件 vim /usr/local/redis/bin/redis.confbind 0.0.0.0 protected-mode no 重新启动redis ...
- SpringBoot—CORS跨域问题详解和解决方案
关注微信公众号:CodingTechWork,一起学习进步. 引言 在前后端开发过程中,遇到过一种错误,类似于报错: Access to XMLHttpRequest at 'http://127 ...
- springboot拦截器与过滤器详解
前言 不管是传统的ssm项目,还是springboot项目,拦截器和过滤器在项目开发中都离不开,比如说对于ssm框架类的项目来说,许多登录逻辑的前置校验,黑白名单的检查,以及部分请求的数据分析等依然需 ...
- 一起来看看SpringBoot蓝天幼儿园管理系统(详解)
项目介绍 蓝天幼儿园管理系统,共分为三种角色: 管理员 家长 教师 管理员角色具有功能: 系统管理:用户管理.页面管理.角色管理 校园管理:老师管理.工资管理.物资管理.菜谱管理.班级管理 班级管理: ...
最新文章
- Java工具类-转换字符编码
- 编写一个程序,它从标准输入(终端)读取C源代码,并验证所有的花括号都正确的成对出现。...
- 【转】Apache配置中ProxyPassReverse指令的含义
- 服务器市场步步为营:Intel发布新款至强Xeon E5-4600v4四路处理器
- move函数c语言,C++11 move()函数:将左值强制转换为右值
- Firefox 65.0.2 发布,Firefox 66 预计3月19日推出
- LDA-math-神奇的Gamma函数
- LAMP(4)Apach和php结合、Apache默认虚拟主机
- [react] 说说你对Error Boundaries的理解
- kafka是存储到本地磁盘么_Kafka 中的消息存储在磁盘上的目录布局是怎样的?
- 数据结构排序1-冒泡,选择,插入排序
- 输入法相关的使用(跳转)
- eds能谱图分析实例_SPC控制图公式_均值极差SPC控制图公式应用实例分析
- C语言-字符型数据与ASCII码表
- mysql pxc集群介绍_MySQL中PXC集群的介绍
- mysql卸载安装pxc_PXC安装
- Excel如何批量插入删除复选框
- 词性标注 python
- 基于Web的文件管理系统,支持Office、WPS预览/编辑、在线解压缩、文件分享、文件加密、远程存储、远程文件推送、秒传、断点
- AWK详解 什么是AWK
热门文章
- 采购交货期延误的原因分析
- 物料评估类型视图扩充
- ABAP--Smart Forms多语言翻译
- SAP系统配置常用命令大全
- 会计核算方法的组成及联系
- 不懂规矩站错位置,“代币”谄媚“区块链”逼于无奈
- pandas读取html并排序,使用pandas怎么实现按照列的值进行排序
- php pcntl扩展下载,linux下如何安装PHP pcntl 扩展
- python grpc 并发_用Python进行gRPC接口测试(二)
- 太阳的光和灯光有什么区别_墙体彩绘机UV(油性)和水性墨水怎么选择?有什么区别?...