在 Spring 中,可以从两个方面来定义Bean的生命周期:(1)Bean 的作用域(2)实例化Bean 时所经历的一系列阶段,下面我们可以从 BeanFactory 与 ApplicationContext来分析 Bean 的生命周期。
先放上一张图片,我们来看看 BeanFactory 中 Bean 完整的生命周期过程。
具体分析过程如下:
(1)如果容器实现了 org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor 接口(实际上最终是实现 BeanPostProcessor 接口),那么我们在 getBean( ) 向容器中请求得到某个Bean时,会先进入 postProcessBeforeInstantiation( ) 方法。作用: 执行Bean 的修改操作。
(2)根据配置情况,选择使用 Bean 的构造函数或者工厂方法来实例化 Bean。
(3)接下来会执行到 InstantiationAwareBeanPostProcessor 接口中 postProcessAfterInstantiation( ) 方法,可以执行Bean的修改操作。
(4)如果我们在配置文件中设定了Bean的属性信息,那么容器将执行InstantiationAwareBeanPostProcessor 接口中 postProcessPropertyValues( ) 方法,为设置每一个属性做准备,注意:设置每一个属性之前都会调用此方法。
(5)调用 Bean 的 setter 方法设置属性值。
(6)给 Bean 设置在配置文件中设定好的名称。方法是:实现 BeanFactoryAware 接口,利用 setBeanName( ) 方法设置。
(7)将 BeanFactory 实例设定到 Bean 中。方法是:实现 BeanFactoryAware 接口,利用 setBeanFactory( ) 方法设置。
(8)如果容器实现了 org.springframework.beans.factory.config.BeanPostProcessor 接口,那么将调用 BeanPostProcessor 中的 Object postProcessBeforeInitialization (Object bean,String beanName) 方法对 Bean 进行相关操作。其中 bean 为当前正在处理的 Bean,beanName为当前 Bean 配置名。我们可以通过 BeanPostProcessor 接口 实现对 Spring 的 AOP,动态代理等。
(9)如果 Bean 实现了 InitializingBean 接口,那么将调用 afterPropertiesSet() 方法。
(10)如果在配置文件中设定了 init-method 属性,那么将会调用这个初始方法。
(11)调用 BeanPostProcessor 中的 Object postProcessAfterInitialization (Object bean,String beanName) 方法再次对 Bean 进行相关操作。
(12)如果将 Bean 的作用域设定为 singleton,那么容器会将 Bean 放入缓存池中,将 Bean 的引用返回给调用者,Spring 继续负责这些 Bean 后续的生命周期管理;若作用域设定为 prototype那么Spring 不负责这些 Bean 后续的生命周期管理,直接将Bean返回给调用者,让调用者负责管理。
(13)对于作用域设定为 singleton 的 Bean,当容器关闭时,将触发Spring 对 Bean 后续的生命周期管理,如果 Spring 实现了 DisposableBean 接口,那么将执行接口的 destory( ) 方法,在这里可以编写释放资源,记录日志等操作。
(14)如果我们指定了 Bean 的 destroy-method 方法,那么 Spring 将执行这个方法,完成释放资源。
Spring 容器实例化 Bean ,调用 Bean ,以及销毁 Bean 都涉及到了特定的方法,可以大致将这些方法分成四类。
(1)Bean 自身的方法:Bean 的构造函数实例化Bean,Setter 方法 设置属性值,init-method与 destroy-method 方法 来初始化与销毁 Bean。
(2)Bean 级生命周期接口方法:BeanFactoryAware,BeanNameAware,InitializingBean,DisposableBean,这些由Bean直接实现。
(3)容器级生命周期接口方法:InstantiationAwareBeanPostProcessor,BeanPostProcessor,可以将这两个的实现类称为“后处理器”。这些接口一般不由Bean直接实现,它们跟Bean是相互独立的,是以插件的形式作用于Bean,默认情况下,是对全局的 Bean 产生影响。
(4)容器级工厂后处理器接口方法:包括AspectJWeavingEnable,CustomAutowireConfigurer,ConfigurationClassPostProcessor 等方法。在应用上下文装配配置文件后立即调用。
Spring 可以注册多个后处理器,只要同时实现 org.springframework.core.Ordered 接口,容器将会按照特定的顺序依次调用这些后处理器。
下一章,我们将来讲 Bean 生命周期实例,根据具体代码来分析 BeanFactory 中 Bean 的生命周期,谢谢关注。