Java EE框架整合开发入门到实战:Spring+Spring MVC+MyBatis(微课版)
上QQ阅读APP看书,第一时间看更新

3.4 Bean的生命周期

一个对象的生命周期包括创建(实例化与初始化)、使用以及销毁等阶段,在Spring中,Bean对象周期也遵循这一过程,但是Spring提供了许多对外接口,允许开发者对3个过程(实例化、初始化、销毁)的前后做一些操作。在Spring Bean中,实例化是为Bean对象开辟空间,初始化则是对属性的初始化。

Spring容器可以管理singlleton作用域Bean的生命周期,在此作用域下,Spring能够精确地知道Bean何时被创建,何时初始化完成,以及何时被销毁。而对于prototype作用域的Bean,Spring只负责创建,当容器创建了Bean的实例后,Bean实例就交给了客户端的代码管理,Spring容器将不再跟踪其生命周期,并且不会管理那些被配置成prototype作用域的Bean。Spring中Bean的生命周期的执行是一个很复杂的过程,可借鉴Servlet的生命周期“实例化→初始化(init)→接收请求(service)→销毁(destroy)”来理解Bean的生命周期。

Bean的生命周期的整个过程如下:

(1)根据Bean的配置情况实例化一个Bean。

(2)根据Spring上下文对实例化的Bean进行依赖注入,即对Bean的属性进行初始化。

(3)如果Bean实现了BeanNameAware接口,将调用它实现的setBeanName(String beanId)方法,此处参数传递的是Spring配置文件中Bean的id。

(4)如果Bean实现了BeanFactoryAware接口,将调用它实现的setBeanFactory方法,此处参数传递的是当前Spring工厂实例的引用。

(5)如果Bean实现了ApplicationContextAware接口,将调用它实现的setApplication Context(ApplicationContext)方法,此处参数传递的是Spring上下文实例的引用。

(6)如果Bean关联了BeanPostProcessor接口,将调用初始化方法postProcess BeforeInitialization(Object obj, String s)对Bean进行操作。

(7)如果Bean实现了InitializingBean接口,将调用afterPropertiesSet方法。

(8)如果Bean在Spring配置文件中配置了init-method属性,将自动调用其配置的初始化方法。

(9)如果Bean关联了BeanPostProcessor接口,将调用postProcessAfterInitialization(Object obj, String s)方法,由于是在Bean初始化结束时调用After方法,也可用于内存或缓存技术。

注意:以上工作完成后就可以使用该Bean,由于该Bean的作用域是singleton,所以调用的是同一个Bean实例。

(10)当Bean不再需要时将进入销毁阶段,如果Bean实现了DisposableBean接口,则调用其实现的destroy方法将Spring中的Bean销毁。

(11)如果在配置文件中通过destroy-method属性指定了Bean的销毁方法,将调用其配置的销毁方法进行销毁。

在Spring中,通过实现特定的接口或通过<bean>元素的属性设置可以对Bean的生命周期过程产生影响。开发者可以随意地配置<bean>元素的属性,但不建议过多地使用Bean实现接口,因为这样将使代码和Spring聚合比较紧密。下面通过一个实例演示Bean的生命周期。

① 创建Bean的实现类

在ch3应用的src目录中创建life包,在life包下创建BeanLife类。在BeanLife类中有两个方法,一个演示初始化过程,一个演示销毁过程。具体代码如下:

② 配置Bean

在Spring配置文件中使用实现类BeanLife配置一个id为beanLife的Bean,具体代码如下:

③ 测试生命周期

在ch3应用的test包中创建测试类TestLife,具体代码如下:

上述测试类的运行结果如图3.7所示。

图3.7 Bean的生命周期演示效果

从图3.7中可以看出,在加载配置文件时执行了Bean的初始化方法initMyself;在获得对象后,关闭容器时,执行了Bean的销毁方法destroyMyself。