@PostConstruct 和 @PreDestroy
468.
469. Spring 容器中的 Bean 是有生命周期的,Spring 允许在 Bean 在初始化完成后以及 Bean 销毁前执行特定的操作,您既可以通过实现 InitializingBean/DisposableBean 接口来定制初始化之后 / 销毁之前的操作方法,也可以通过 <bean> 元素的 init-method/destroy-method 属性指定初始化之后 / 销毁之前调用的操作方法。关于 Spring 的生命周期,笔者在《精通 Spring 2.x—企业应用开发精解》第 3 章进行了详细的描述,有兴趣的读者可以查阅。
470.
471. JSR-250 为初始化之后/销毁之前方法的指定定义了两个注释类,分别是 @PostConstruct 和 @PreDestroy,这两个注释只能应用于方法上。标注了 @PostConstruct 注释的方法将在类实例化后调用,而标注了 @PreDestroy 的方法将在类销毁之前调用。
472.
473.
474. 清单 17. 使用 @PostConstruct 和 @PreDestroy 注释的 Boss.java
475.
476. package com.baobaotao;
477.
478. import javax.annotation.Resource;
479. import javax.annotation.PostConstruct;
480. import javax.annotation.PreDestroy;
481.
482. public class Boss {
483. @Resource
484. private Car car;
485.
486. @Resource(name = "office")
487. private Office office;
488.
489. @PostConstruct
490. public void postConstruct1(){
491. System.out.println("postConstruct1");
492. }
493.
494. @PreDestroy
495. public void preDestroy1(){
496. System.out.println("preDestroy1");
497. }
498. …
499. }
500.
501.
502.
503. 您只需要在方法前标注 @PostConstruct 或 @PreDestroy,这些方法就会在 Bean 初始化后或销毁之前被 Spring 容器执行了。
504.
505. 我们知道,不管是通过实现 InitializingBean/DisposableBean 接口,还是通过 <bean> 元素的 init-method/destroy-method 属性进行配置,都只能为 Bean 指定一个初始化 / 销毁的方法。但是使用 @PostConstruct 和 @PreDestroy 注释却可以指定多个初始化 / 销毁方法,那些被标注 @PostConstruct 或 @PreDestroy 注释的方法都会在初始化 / 销毁时被执行。
506.
507. 通过以下的测试代码,您将可以看到 Bean 的初始化 / 销毁方法是如何被执行的:
508.
509.
510. 清单 18. 测试类代码
511.
512. package com.baobaotao;
513.
514. import org.springframework.context.support.ClassPathXmlApplicationContext;
515.
516. public class AnnoIoCTest {
517.
518. public static void main(String[] args) {
519. String[] locations = {"beans.xml"};
520. ClassPathXmlApplicationContext ctx =
521. new ClassPathXmlApplicationContext(locations);
522. Boss boss = (Boss) ctx.getBean("boss");
523. System.out.println(boss);
524. ctx.destroy();// 关闭 Spring 容器,以触发 Bean 销毁方法的执行
525. }
526. }
527.
528.
529.
530. 这时,您将看到标注了 @PostConstruct 的 postConstruct1() 方法将在 Spring 容器启动时,创建 Boss Bean 的时候被触发执行,而标注了 @PreDestroy 注释的 preDestroy1() 方法将在 Spring 容器关闭前销毁 Boss Bean 的时候被触发执行。