这两个注解是JSR-250引入的注解
-
@PostConstruct
被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Serclet的inti()方法。被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行。
PostConstruct
注释用于在完成依赖项注入以执行任何初始化之后需要执行的方法。必须在类投入使用之前调用此方法。所有支持依赖注入的类都必须支持此注释。使用PostConstruct
注释的方法必须被执行,即使类没有请求注入任何资源。一个类只有一个方法可以使用此注释进行注释。应用PostConstruct
注释的方法必须满足以下所有标准:
除了拦截器之外,该方法绝不能有任何参数,在这种情况下,它采用Interceptor规范定义的InvocationContext对象。
-
在拦截器类上定义的方法必须具有以下形式之一:
void <METHOD>(InvocationContext)
Object <METHOD>(InvocationContext) throws Exception
PostConstruct拦截器方法不能抛出应用程序异常,但如果相同的拦截器方法除了生命周期事件之外插入业务或超时方法,它也可以被声明为抛出已检查的异常,包括java.lang.Exception。如果PostConstruct拦截器方法返回一个值,容器将忽略它。
在非拦截器类上定义的方法必须具有以下形式:
void <METHOD>()应用PostConstruct的方法可以是公共的,受保护的,包私有的或私有的。
The method MUST NOT be static except for the application client.
The method MAY be final.
如果该方法抛出一个未经检查的异常,那么该类绝不能投入使用,除非EJB可以处理异常甚至从它们中恢复的EJB。
-
@PreDestroy
被@PreDestroy修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreDestroy修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前。
与@Resource一样,@ PostConstruct和@PreDestroy注释类型是JDK 6到8的标准Java库的一部分。但是,整个javax.annotation包与JDK 9中的核心Java模块分离,最终在JDK 11中删除。如果需要,现在需要通过导入javax.annotation-api
jar。
spring中的@PostConstruct和@PreDestroy
在spring中@PostConstruct和@PreDestroy能够控制bean的生命周期