@PostConstruct、@PreDestroy注解介绍及Spring中@PostConstruct、constructor、@Autowired的顺序
@PostConstruct和@PreDestroy
@PostConstruct和@PreDestroy注解是Common Annotations中的注解,Common Annotations原本是Java EE 5.0(JSR 244)规范的一部分,现在SUN把它的一部分放到了Java SE 6.0中。
JDK文档中对这两个注解的描述如下:
PostConstruct 注释用于在依赖关系注入完成之后需要执行的方法上,以执行任何初始化。此方法必须在将类放入服务之前调用。支持依赖关系注入的所有类都必须支持此注释。即使类没有请求注入任何资源,用 PostConstruct 注释的方法也必须被调用。只有一个方法可以用此注释进行注释。应用 PostConstruct 注释的方法必须遵守以下所有标准:该方法不得有任何参数,除非是在 EJB 拦截器 (interceptor) 的情况下,根据 EJB 规范的定义,在这种情况下它将带有一个 InvocationContext 对象 ;该方法的返回类型必须为 void;该方法不得抛出已检查异常;应用 PostConstruct 的方法可以是 public、protected、package private 或 private;除了应用程序客户端之外,该方法不能是 static;该方法可以是 final;如果该方法抛出未检查异常,那么不得将类放入服务中,除非是能够处理异常并可从中恢复的 EJB。
PreDestroy 注释作为回调通知用于各方法,以表示该实例正处于被容器移除的过程中。用 PreDestroy 注释的方法通常用于释放它已持有的资源。除 Java EE 5 中的应用程序客户端容器之外,所有支持 PostConstruct 的容器管理对象都必须支持此注释。应用 PreDestroy 注释的方法必须遵守以下所有标准:该方法不得有任何参数,除非是在 EJB 拦截器 (interceptor) 的情况下,根据 EJB 规范的定义,在这种情况下它将带有一个 InvocationContext 对象;该方法的返回类型必须为 void;该方法不得抛出已检查异常;应用 PreDestroy 的方法可以是 public、protected、package private 或 private;该方法不得是 static;该方法可以是 final;如果该方法抛出未检查异常,则忽略此异常,除非是能够处理异常的 EJB。
可以看出,这两个注解所标注的方法都是由bean容器来回调。@PostConstruct所作用的方法会在bean的依赖关系注入完成后被容器回调,@PreDestroy所作用的方法会在bean从容器移除前回调。
Spring下@PostConstruct、constructor、@Autowired的顺序
很显然,在自动装配bean的属性之前需要得到这个bean的实例,所以constructor应该在@Autowired之前调用。根据上面的介绍,@PostConstruct应该在@Autowired后调用。
即,constructor -> @Autowired -> @PostConstruct 这样一个顺序。
验证代码如下:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;@Component("cdPlayer_3")
public class CDPlayer_3 implements MediaPlayer {@Autowired/** @Autowired注解作用在属性上实现自动装配。根据类型装配,直接赋值给bean的属性,不调用setter。*/private CompactDisc cd;private CDPlayer_3() {System.out.println("enter cdPlayer_3(), is cd null? " + (cd == null));}@PostConstructpublic void init() {System.out.println("enter V init(), is cd null? " + (cd == null));}@Overridepublic void play() {cd.play();}}
创建bean输出如下:
enter cdPlayer_3(), is cd null? true
enter V init(), is cd null? false
类似地,@PostConstruct注解标注的方法也会在@Autowired注解标注的方法之后才执行。
@PostConstruct、@PreDestroy注解介绍及Spring中@PostConstruct、constructor、@Autowired的顺序相关推荐
- Spring中@Resource与@Autowired、@Qualifier的用法与区别
Spring中@Resource与@Autowired.@Qualifier的用法与区别 1.@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法 ...
- spring中@Inject和@Autowired的区别?分别在什么条件下使用呢?
问题:spring中@Inject和@Autowired的区别?分别在什么条件下使用呢? 我在浏览SpringSource上的一些博客,在其他一个博客中,那个作者用了@Inject,但是我觉得他用@A ...
- spring 中构造Constructor、@Autowired、@PostConstruct、静态方法的执行顺序 (@PostConstruct 说明)
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1. 关于注解 PostConstruct public @interface PostConst ...
- java为什么引入注解_说说Spring中为何要引入Lookup注解
前言 我们先探一探官方文档关于Method Injection的章节是怎么说的: In most application scenarios, most beans in the container ...
- Spring 中的各种注解,光会用可不够哦!
来源:https://digdeep.cnblogs.com/digdeep/p/4525567.html 1. Java中的注解 2. 使用 元注解 来自定义注解 和 处理自定义注解 3. spri ...
- Spring中异步注解@Async的使用、原理及使用时可能导致的问题
前言 最近,很多同学碰到了下面这个问题,添加了Spring提供的一个异步注解@Async循环依赖无法被解决了,下面是一些读者的留言跟群里同学碰到的问题: 本着讲一个知识点就要讲明白.讲透彻的原则,我决 ...
- Spring中的@Value注解详解
本文主要介绍Spring @Value 注解注入属性值的使用方法的分析,文章通过示例代码非常详细地介绍,对于每个人的学习或工作都有一定的参考学习价值 文章目录 概述 使用方式 基于配置文件的注入 基于 ...
- Spring 中的Advice类型介绍
Spring 中的 Advice 类型介绍 翻译原文链接 Introduction to Advice Types in Spring 1. 概述 在本文中,我们将讨论可以在 Spring 中创建的不 ...
- Spring中的IOC介绍
Spring中的IOC介绍 IOC(控制反转) IOC介绍 IOC是什么 IOC能做什么 Spring容器管理对象 1.maven管理依赖 2.给定容器的配置文件 3.IOC容器管理对象 4.通过容器 ...
最新文章
- 静态库和共享库之间的区别?
- 数据采集之解析Mysql的binlog日志发送至Kafka实时消费(转:https://blog.csdn.net/liguohuabigdata/article/details/79472777)
- 批处理中setlocal enabledelayedexpansion的作用详细整理
- HTML提交弹出提交中,javascript – 从弹出窗口在父窗口中提交表单?
- zabbix mysql复制延迟_mysql 主从复制延迟监控
- CentOS 7关闭firewalld启用iptables
- 希尔排序java写法_java高级排序之希尔排序
- 剑指|| offer1整数除法
- GitHub 引入缺陷和Pull Request 模版,并支持直接上传文件
- robot---百度百科
- 【Chapter 1】什么是软件架构
- Java安全生态-Java加解密API详解-Java安全框架官方文档翻译:对称/非对称加密、数字签名、数字证书、安全通信、密钥库等
- vue设置必填项和判断必填项是否填入的弹窗提示
- [译] Oracle Database 21c 中的 SQL 集合运算符增强功能(EXCEPT、EXCEPT ALL、MINUS ALL、INTERSECT ALL)
- 51单片机数字电压表仿真设计_LCD显示
- 有关Nodejs的视频教程
- 抢票软件之——py12306使用指南
- 修改过----AtCoder Beginner Contest 190 D	Staircase Sequences(唯一分解求因子数)
- 2019.11.20 LS-Dyna与MSC.Dytran特点
- Transformer15
热门文章
- 传聊天宝团队解散 罗永浩已退出股东行列
- c++中使用libxml2读取xml文件【转】
- python字符串出栈方法_Python 实现字符串反转的9种方法
- Mysql导入导出数据总结
- html背景图适应div_CSS实现背景图片屏幕自适应
- 【clickhouse】clickhouse NO DELAY, INTO OUTFILE, SETTINGS, ON, FORMAT, Dot, SYNC, token
- 【clickhouse】clickhouse表引擎之CollapsingMergeTree
- 【java】java ReentrantLock 源码详解
- 【高并发】ThreadLocal、InheritableThreadLocal
- 95-140-104-源码-transform-算子flatMap