spring 管理bean的生命周期

一、知识点

(1)spring ioc管理bean的生命周期

spring允许在bean生命周期的特定点执行定制的任务。

spring ioc容器对bean的生命周期进行管理的过程:

  1. 通过构造器或工厂方法创建bean实例。
  2. 为bean的属性设置值和其他bean的引用。
  3. 调用bean的初始化方法。
  4. bean可以使用了。
  5. 当容器关闭时,调用bean的销毁方法。

在bean的声明里设置init-method和destroy-method属性,为bean指定初始化和销毁方法。

例子:cycle.xml

init-method和destroy-method为bean在生命周期的初始化和销毁阶段执行的函数。

这里在初始化时执行的就是init函数,在销毁时执行的就是destroy函数。

运行结果:

可以看见,bean被创建,bean被赋值,bean被初始化,获得bean对象,bean被销毁。

(2)创建bean后置处理器

bean后置处理器允许在调用初始化方法前后对bean进行额外的处理。

bean后置处理器对ioc容器里的所有bean实例逐一扫描,而非单一实例。其典型应用是:检查bean的正确性或根据特定的标准更改bean的属性。

对bean后置处理器而言,需要实现 interface beanpostprocessor接口,在初始化方法被调用前后,spring将把每个bean实例分别传递给上述接口的两个方法。

加上bean后置处理器后bena的生命周期变得更加细致了。

加上后置处理器后,spring ioc容器对bean的生命周期进行管理的过程:

  1. 通过构造器或工厂方法创建bean实例。
  2. 为bean的属性设置值和其他bean的引用。
  3. 将bean实例传递给bean后置处理器的postprocessbeforeinitialization方法。
  4. 调用bean的初始化方法。
  5. 将bean实例传递给bean后置处理器的postprocessafterinitialization方法。
  6. bean可以使用了。
  7. 当容器关闭时,调用bean的销毁方法。

仅仅多了这两步处理:

  1. 将bean实例传递给bean后置处理器的postprocessbeforeinitialization方法。
  2. 将bean实例传递给bean后置处理器的postprocessafterinitialization方法。

尝试新建java类processor.java,继承了BeanPostProcessor接口:

改写cycle.xml

运行结果:

正确插入了两个中间过程。

后置处理器相当强大,甚至可以偷梁换柱,尝试直接把mysoul这个属性换掉:

输出结果:

输出结果从mysoul变成了myblood。

为什么呢?因为整个bean的生命周期是完整地走下来的,我在中间过程postProcessBeforeInitialization替换了bean,那么接下来的步骤是按替换的bean走下去的。

所以postProcessAfterInitialization和最后输出的bean值都是被替换的bean,mysoul就变成了myblood。

有一种用法是在特定时候执行特定的方法:

例如我们想在bean=god的时候输出一段话,就可以在postProcessBeforeInitialization里这样写:

加了这个判断语句之后,输出变成了:

个人认为,这两个方法相当于中间人,提供了操作bean的机会,可以在这init-method之前、之后这两个时间节点实现很多功能。

注意:BeanPostProcessor这个类是不需要配id的,spring会自动识别这是一个bean后置处理器,并且把后置处理器嵌入的bean的生命周期中。

二、总结

非常常见的知识点,非常常用的功能,必须熟练掌握。

发表评论

电子邮件地址不会被公开。 必填项已用*标注