从Java EE5规范开始,Servlet中增加了两个影响Servlet生命周期的注解,@PostConstruct和@PreDestroy,这两个注解被用来修饰一个非静态的void()方法。写法有如下两种方式:

    1. @PostConstruct
    2. public void method(){}
    3. public @PostConstruct void method(){}

    被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Serclet的init()方法。被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行。
    被@PreDestroy修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreDestroy修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前。
    服务器加载Servlet过程:
    @PostConstruct - 图1
    另外,spring中Constructor、@Autowired、@PostConstruct的顺序:
    其实从依赖注入的字面意思就可以知道,要将对象B注入到对象A,那么首先就必须得生成对象A和对象B,才能执行注入。所以,如果一个类A中有个成员变量b被@Autowried注解,那么@Autowired注入是发生在A的构造方法执行完之后的。
    如果想在生成对象时完成某些初始化操作,而偏偏这些初始化操作又依赖于依赖注入,那么久无法在构造函数中实现。为此,可以使用@PostConstruct注解一个方法来完成初始化,@PostConstruct注解的方法将会在依赖注入完成后被自动调用。
    Constructor >> @Autowired >> @PostConstruct
    举个栗子:

    1. @Component
    2. public class A {
    3. @Autowired
    4. private B b;
    5. public A() {
    6. System.out.println("执行A的构造方法,此时b还未被注入: b = " + b);
    7. }
    8. @PostConstruct
    9. private void init() {
    10. System.out.println("@PostConstruct将在依赖注入完成后被自动调用: b = " + b);
    11. }
    12. }
    13. @Component
    14. public class B {
    15. public B(){
    16. System.out.println("执行B的构造方法");
    17. }
    18. }

    测试类:

    1. @RunWith(SpringJUnit4ClassRunner.class)
    2. @ContextConfiguration(locations = {"classpath:application-context.xml"})
    3. public class MessageTest {
    4. @Resource
    5. A a;
    6. @Test
    7. public void testAB(){
    8. }
    9. }