@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));
    }

    @PostConstruct
    public void init() {
        System.out.println("enter V init(), is cd null? " + (cd == null));
    }

    @Override
    public void play() {
        cd.play();
    }

}

创建bean输出如下:

enter cdPlayer_3(), is cd null? true
enter V init(), is cd null? false

类似地,@PostConstruct注解标注的方法也会在@Autowired注解标注的方法之后才执行。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值