8.2.4 使用@PostConstruct和@PreDestroy定制生命周期行为

8.2.4 使用@PostConstruct和@PreDestroy定制生命周期行为

@PostConstruct@PreDestroy同样位于Javax.annotation包下,也是来自Java EE规范的两个注解,Spring直接借鉴了它们,用于定制Spring容器中Bean的生命周期行为。

XML配置如何指定生命周期方法

前面介绍Spring生命周期时提供了<bean>元素可以指定init-methoddestroy-method两个属性。

bean元素的属性 描述
init-method属性 用于指定Bean的初始化方法,Spring容器将会在Bean的依赖关系注入完成后回调该方法。
destroy-method属性 用于指定Bean销毁之前的方法,Spring容器将会在销毁该Bean之前回调该方法。

使用注解如何指定生命周期方法

@PostConstruct@PreDestroy两个注解的作用大致与此相似,它们都用于修饰方法,无须任何属性。
其中

  • @PostConstruct修饰的方法是Bean的初始化方法;
  • @PreDestroy修饰的方法是Bean销毁之前的要调用方法。

程序示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
E:\workspace_QingLiangJiJavaEEQiYeYingYongShiZhang5\lifecycle
└─src\
├─beans.xml
├─lee\
│ └─BeanTest.java
└─org\
└─crazyit\
└─app\
└─service\
├─Axe.java
├─impl\
│ ├─Chinese.java
│ └─SteelAxe.java
└─Person.java

例如如下Bean实现类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package org.crazyit.app.service.impl;

import org.springframework.stereotype.*;
import javax.annotation.*;
import org.crazyit.app.service.*;

@Component
public class Chinese implements Person
{
// 执行Field注入
@Resource(name = "steelAxe")
private Axe axe;
// 实现Person接口的useAxe()方法
public void useAxe()
{
// 调用axe的chop()方法,
// 表明Person对象依赖于axe对象
System.out.println(axe.chop());
}
@PostConstruct
public void init()
{
System.out.println("正在执行初始化的init方法...");
}
@PreDestroy
public void close()
{
System.out.println("正在执行销毁之前的close方法...");
}
}

上面的Chinese类中使用了@PostConstruct修饰init()方法,这就让Spring在该Bean的依赖关系注入完成之后回调该方法;使用了@PreDestroy修饰close()方法,这就让Spring在销毁该Bean之前回调该方法。