美文网首页
@PostConstruct注解

@PostConstruct注解

作者: 阳公子_ | 来源:发表于2020-07-17 11:40 被阅读0次

    简介

    Java EE5 引入了@PostConstruct@PreDestroy这两个作用于Servlet生命周期的注解,实现Bean初始化之前和销毁之前的自定义操作。此文主要说明@PostConstruct

    API使用说明

    PostConstruct 注释用于在依赖关系注入完成之后需要执行的方法上,以执行任何初始化。此方法必须在将类放入服务之前调用。支持依赖关系注入的所有类都必须支持此注释。即使类没有请求注入任何资源,用PostConstruct注释的方法也必须被调用。只有一个方法可以用此注释进行注释。应用 PostConstruct 注释的方法必须遵守以下所有标准:该方法不得有任何参数,除非是在 EJB 拦截器 (interceptor) 的情况下,根据 EJB 规范的定义,在这种情况下它将带有一个 InvocationContext 对象 ;该方法的返回类型必须为 void;该方法不得抛出已检查异常;应用 PostConstruct 的方法可以是 publicprotectedpackage privateprivate;除了应用程序客户端之外,该方法不能是 static;该方法可以是 final;如果该方法抛出未检查异常,那么不得将类放入服务中,除非是能够处理异常并可从中恢复的 EJB。

    总结一下:

    • 只有一个方法可以使用此注释进行注解;
    • 被注解方法不得有任何参数;
    • 被注解方法返回值为void
    • 被注解方法不得抛出已检查异常;
    • 被注解方法需是非静态方法;
    • 此方法只会被执行一次;

    Servelet执行流程

    1.jpg
    在具体Bean的实例化过程中,@PostConstruct注释的方法,会在构造方法之后,init方法之前进行调用。
    spring中Constructor@Autowired@PostConstruct的顺序:其实从依赖注入的字面意思就可以知道,要将对象p注入到对象a,那么首先就必须得生成对象a和对象p,才能执行注入。所以,如果一个类A中有个成员变量p被@Autowried注解,那么@Autowired注入是发生在A的构造方法执行完之后的。
    如果想在生成对象时完成某些初始化操作,而偏偏这些初始化操作又依赖于依赖注入,那么久无法在构造函数中实现。为此,可以使用@PostConstruct注解一个方法来完成初始化,@PostConstruct注解的方法将会在依赖注入完成后被自动调用。
    Constructor >> @Autowired >> @PostConstruct
    public Class AAA {
        @Autowired
        private BBB b;
    
        public AAA() {
            System.out.println("此时b还未被注入: b = " + b);
        }
    
        @PostConstruct
        private void init() {
            System.out.println("@PostConstruct将在依赖注入完成后被自动调用: b = " + b);
        }
    }
    

    写法和用法

    @PostConstruct@PreDestroy,这两个注解被用来修饰一个非静态的void()方法。写法有如下两种方式:

    @PostConstruct
    public void someMethod(){}
    //或者
    public @PostConstruct void someMethod(){}
    

    @PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。PreDestroy()方法在destroy()方法知性之后执行。

    Reference

    1、注解@PostConstruct与@PreDestroy详解及实例
    2、@PostConstruct

    相关文章

      网友评论

          本文标题:@PostConstruct注解

          本文链接:https://www.haomeiwen.com/subject/huxghktx.html