Spring4.0学习7--IOC 容器中 Bean 的生命周期方法 和 创建 Bean 后置处理器

IOC 容器中 Bean 的生命周期方法

Spring IOC 容器可以管理 Bean 的生命周期, Spring 允许在 Bean 生命周期的特定点执行定制的任务.
Spring IOC 容器对 Bean 的生命周期进行管理的过程:

  • 通过构造器或工厂方法创建 Bean 实例
  • 为 Bean 的属性设置值和对其他 Bean 的引用
  • 调用 Bean 的初始化方法
  • Bean 可以使用了
  • 当容器关闭时, 调用 Bean 的销毁方法
    在 Bean 的声明里设置 init-method 和 destroy-method 属性, 为 Bean 指定初始化和销毁方法.

注意:由于对xml不怎么了解,以为所有的xml头部的http xmln都是一样的,然后跟着视频练习,报错:cvc-complex-type.3.2.2: 元素 'bean' 中不允许出现属性 'destory-method',当时百思不得其解,因为视频里的老师也没做什么特别的操作,然后问以前同事,他告诉我上面的http xlmn这种连接我没导入,尴尬。又是一个坑,踩到了。
重开一个包com.chenyixun,新建测试用的Main.java和Car.java,src下新建beans-cycle.xml
Car.java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Car {
public Car() {
super();
// TODO Auto-generated constructor stub
System.out.println("constructor...");
}
private String brand;
public void setBrand(String brand) {
System.out.println("setBrand...");
this.brand = brand;
}
public void init2() {
System.out.println("init2...");
}
public void destory() {
System.out.println("destory...");
}
}

beans-cycle.xml(注意该配置文件头部导入对应的http xmln连接):

1
2
3
<bean id="car" class="com.chenyixun.Car" init-method="init2" destory-method="destory">
<property name="brand" value="玛莎拉蒂"></property>
</bean>

Main.java:

1
2
3
4
5
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans-cycle.xml");
Car car = (Car)ctx.getBean("car");
System.out.println(car);
// 关闭IOC容器
ctx.close();

运行打印输出发现,构造器最先打印,在容器关闭的时候调destory方法

创建 Bean 后置处理器

Bean 后置处理器允许在调用初始化方法前后对 Bean 进行额外的处理.
Bean 后置处理器对 IOC 容器里的所有 Bean 实例逐一处理, 而非单一实例. 其典型应用是: 检查 Bean 属性的正确性或根据特定的标准更改 Bean 的属性.
对Bean 后置处理器而言, 需要实现Interface BeanPostProcessor接口. 在初始化方法被调用前后, Spring 将把每个 Bean 实例分别传递给上述接口的以下两个方法:

  • postProcessAfterInitialization(Object bean, String beanName)
  • postProcessBeforeinitialization(Object bean, String beanName)

Spring IOC 容器对 Bean 的生命周期进行管理的过程:

  • 通过构造器或工厂方法创建 Bean 实例
  • 为 Bean 的属性设置值和对其他 Bean 的引用
  • 将 Bean 实例传递给 Bean 后置处理器的 postProcessBeforeInitialization 方法
  • 调用 Bean 的初始化方法
  • 将 Bean 实例传递给 Bean 后置处理器的 postProcessAfterInitialization方法
  • Bean 可以使用了
  • 当容器关闭时, 调用 Bean 的销毁方法
1
2
3
4
5
6
7
8
9
10
11
12
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization: " + bean + "," + beanName);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization: " + bean + "," + beanName);
return bean;
}
}

需要在配置文件里面配置

1
2
3
4
5
6
7
8
9
10
<!--
实现BeanPostProcessor接口,并提供
Object postProcessBeforeInitialization(Object bean, String beanName): init-method方法之前
Object postProcessAfterInitialization(Object bean, String beanName): init-method方法之后
的实现
bean: bean本身
beanName: IOC容器配置bean的名字
返回值:实际上返回给用户的那个bean,注意:可以在以上两个方法中返回修改的bean,甚至返回一个新的bean
-->
<bean class="com.chenyixun.MyBeanPostProcessor"/>

Newer Post

Spring4.0学习8--通过工厂方法配置bean

通过调用静态工厂方法创建 Bean 调用静态工厂方法创建 Bean是将对象创建的过程封装到静态方法中. 当客户端需要对象时, 只需要简单地调用静态方法, 而不同关心创建对象的细节.要声明通过静态方法创建的 Bean, 需要在 Bean 的 class 属性里指定拥有该工厂的方法的类, 同时在 fac …

继续阅读
Older Post

Spring4.0学习6--使用外部属性文件和SpEL

使用外部属性文件 在配置文件里配置 Bean 时, 有时需要在 Bean 的配置里混入系统部署的细节信息(例如: 文件路径, 数据源配置信息等). 而这些部署细节实际上需要和 Bean 配置相分离Spring 提供了一个 PropertyPlaceholderConfigurer 的 BeanFac …

继续阅读