1、
Servlet中增加了两个影响Servlet生命周期的注解,@PostConstruct和@PreDestroy,这两个注解被用来修饰一个非静态的void()方法。写法有如下两种方式:
@PostConstruct
public void someMethod(){}
或者
public @PostConstruct void someMethod(){}
被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行(这里的init()方法可以换成其他名称)。PreDestroy()方法在destroy()方法执行之后执行
执行顺序:
--------------------------------------------------------------------------------------
2、spring中Constructor、@Autowired、@PostConstruct的顺序
其实从依赖注入的字面意思就可以知道,**要将对象p注入到对象a,那么首先就必须得生成对象a和对象p,才能执行注入。**所以,如果一个类A中有个成员变量p被@Autowried注解,那么@Autowired注入是发生在A的构造方法执行完之后的。
如果想在生成对象时完成某些初始化操作,而偏偏这些初始化操作又依赖于依赖注入,那么就无法在构造函数中实现。为此,可以使用@PostConstruct注解一个方法来完成初始化,@PostConstruct注解的方法将会在依赖注入完成后被自动调用。
2.1 相同类中,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);
}
}
2.2 在类A中注入类B,调用顺序A构造方法->B构造方法->B @Autowired-> B @PostConstruct-> A @Autowired-> A @PostConstruct
3、使用场景
在项目中主要是在Servlet初始化之前加载一些缓存数据等
特点:
1、只有一个非静态方法能使用此注解
2、被注解的方法不得有任何参数
3、被注解的方法返回值必须为void
4、被注解方法不得抛出已检查异常
5、此方法只会被执行一次
6、除了应用程序客户端之外,该方法不能是 static;该方法可以是 final;如果该方法抛出未检查异常,那么不得将类放入服务中,除非是能够处理异常并可从中恢复的 EJB。
4、注意事项
使用此注解时会影响服务启动时间。服务启动时会扫描WEB-INF/classes的所有文件和WEB-INF/lib下的所有jar包。