简介
Java EE5 引入了@PostConstruct
和@PreDestroy
这两个作用于Servlet生命周期的注解,实现Bean初始化之前和销毁之前的自定义操作。此文主要说明@PostConstruct
。
API使用说明
PostConstruct
注释用于在依赖关系注入完成之后需要执行的方法上,以执行任何初始化。此方法必须在将类放入服务之前调用。支持依赖关系注入的所有类都必须支持此注释。即使类没有请求注入任何资源,用PostConstruct
注释的方法也必须被调用。只有一个方法可以用此注释进行注释。应用 PostConstruct 注释的方法必须遵守以下所有标准:该方法不得有任何参数,除非是在 EJB 拦截器 (interceptor) 的情况下,根据 EJB 规范的定义,在这种情况下它将带有一个InvocationContext
对象 ;该方法的返回类型必须为void
;该方法不得抛出已检查异常;应用 PostConstruct 的方法可以是public
、protected
、package private
或private
;除了应用程序客户端之外,该方法不能是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()
方法知性之后执行。
网友评论