@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的顺序相关推荐

  1. Spring中@Resource与@Autowired、@Qualifier的用法与区别

    Spring中@Resource与@Autowired.@Qualifier的用法与区别 1.@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法 ...

  2. spring中@Inject和@Autowired的区别?分别在什么条件下使用呢?

    问题:spring中@Inject和@Autowired的区别?分别在什么条件下使用呢? 我在浏览SpringSource上的一些博客,在其他一个博客中,那个作者用了@Inject,但是我觉得他用@A ...

  3. spring 中构造Constructor、@Autowired、@PostConstruct、静态方法的执行顺序 (@PostConstruct 说明)

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1. 关于注解 PostConstruct  public @interface PostConst ...

  4. java为什么引入注解_说说Spring中为何要引入Lookup注解

    前言 我们先探一探官方文档关于Method Injection的章节是怎么说的: In most application scenarios, most beans in the container ...

  5. Spring 中的各种注解,光会用可不够哦!

    来源:https://digdeep.cnblogs.com/digdeep/p/4525567.html 1. Java中的注解 2. 使用 元注解 来自定义注解 和 处理自定义注解 3. spri ...

  6. Spring中异步注解@Async的使用、原理及使用时可能导致的问题

    前言 最近,很多同学碰到了下面这个问题,添加了Spring提供的一个异步注解@Async循环依赖无法被解决了,下面是一些读者的留言跟群里同学碰到的问题: 本着讲一个知识点就要讲明白.讲透彻的原则,我决 ...

  7. Spring中的@Value注解详解

    本文主要介绍Spring @Value 注解注入属性值的使用方法的分析,文章通过示例代码非常详细地介绍,对于每个人的学习或工作都有一定的参考学习价值 文章目录 概述 使用方式 基于配置文件的注入 基于 ...

  8. Spring 中的Advice类型介绍

    Spring 中的 Advice 类型介绍 翻译原文链接 Introduction to Advice Types in Spring 1. 概述 在本文中,我们将讨论可以在 Spring 中创建的不 ...

  9. Spring中的IOC介绍

    Spring中的IOC介绍 IOC(控制反转) IOC介绍 IOC是什么 IOC能做什么 Spring容器管理对象 1.maven管理依赖 2.给定容器的配置文件 3.IOC容器管理对象 4.通过容器 ...

最新文章

  1. 静态库和共享库之间的区别?
  2. 数据采集之解析Mysql的binlog日志发送至Kafka实时消费(转:https://blog.csdn.net/liguohuabigdata/article/details/79472777)
  3. 批处理中setlocal enabledelayedexpansion的作用详细整理
  4. HTML提交弹出提交中,javascript – 从弹出窗口在父窗口中提交表单?
  5. zabbix mysql复制延迟_mysql 主从复制延迟监控
  6. CentOS 7关闭firewalld启用iptables
  7. 希尔排序java写法_java高级排序之希尔排序
  8. 剑指|| offer1整数除法
  9. GitHub 引入缺陷和Pull Request 模版,并支持直接上传文件
  10. robot---百度百科
  11. 【Chapter 1】什么是软件架构
  12. Java安全生态-Java加解密API详解-Java安全框架官方文档翻译:对称/非对称加密、数字签名、数字证书、安全通信、密钥库等
  13. vue设置必填项和判断必填项是否填入的弹窗提示
  14. [译] Oracle Database 21c 中的 SQL 集合运算符增强功能(EXCEPT、EXCEPT ALL、MINUS ALL、INTERSECT ALL)
  15. 51单片机数字电压表仿真设计_LCD显示
  16. 有关Nodejs的视频教程
  17. 抢票软件之——py12306使用指南
  18. 修改过----AtCoder Beginner Contest 190 D Staircase Sequences(唯一分解求因子数)
  19. 2019.11.20 LS-Dyna与MSC.Dytran特点
  20. Transformer15

热门文章

  1. 传聊天宝团队解散 罗永浩已退出股东行列
  2. c++中使用libxml2读取xml文件【转】
  3. python字符串出栈方法_Python 实现字符串反转的9种方法
  4. Mysql导入导出数据总结
  5. html背景图适应div_CSS实现背景图片屏幕自适应
  6. 【clickhouse】clickhouse NO DELAY, INTO OUTFILE, SETTINGS, ON, FORMAT, Dot, SYNC, token
  7. 【clickhouse】clickhouse表引擎之CollapsingMergeTree
  8. 【java】java ReentrantLock 源码详解
  9. 【高并发】ThreadLocal、InheritableThreadLocal
  10. 95-140-104-源码-transform-算子flatMap