2.4 Bean的生命周期
在IoC容器启动之后,并不会马上就实例化相应的bean,此时容器仅仅拥有所有对象的BeanDefinition(BeanDefinition:是容器依赖某些工具加载的XML配置信息进行解析和分析,并将分析后的信息编组为相应的BeanDefinition)。只有当getBean()调用时才是有可能触发Bean实例化阶段的活动
可以简述为以下九步:
1. 实例化bean对象(通过构造方法或者工厂方法)
2. 设置对象属性(setter等)(依赖注入)
3. 如果Bean实现了BeanNameAware接口,工厂调用Bean的setBeanName()方法传递Bean的ID。(和下面的一条均属于检查Aware接口)
4. 如果Bean实现了BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身
5. 将Bean实例传递给Bean的前置处理器的postProcessBeforeInitialization(Object bean, String beanname)方法
6. 调用Bean的初始化方法
7. 将Bean实例传递给Bean的后置处理器的postProcessAfterInitialization(Object bean, String beanname)方法
8. 使用Bean
9. 容器关闭之前,调用Bean的销毁方法
Bean的完整生命周期经历了各种方法调用,这些方法可以划分为以下几类:
l Bean自身的方法:这个包括了Bean本身调用的方法和通过配置文件中<bean>的init-method和destroy-method指定的方法
l Bean级生命周期接口方法:这个包括了BeanNameAware、BeanFactoryAware、InitializingBean和DiposableBean这些接口的方法
l 容器级生命周期接口方法:这个包括了InstantiationAwareBeanPostProcessor 和 BeanPostProcessor 这两个接口实现,一般称它们的实现类为“后处理器”。
l 工厂后处理器接口方法:这个包括了AspectJWeavingEnabler、 ConfigurationClassPostProcessor、CustomAutowireConfigurer等等非常有用的工厂后处理器接口的方法。工厂后处理器也是容器级的。在应用上下文装配配置文件之后立即调用。
Spring的生命周期可以从 BeanFactory 和 ApplicationContext 中的生命周期进行分析,BeanFactory实例化Bean相关接口分为Bean级和容器级。bean级接口我们一般不实现,容器级如果需要处理一些共有特性,可以考虑实现,ApplicationContext中bean的生命周期与BeanFactory类似。beanFactory中的后处理器接口需要调用addBeanPostProcessor方法进行注册,而ApplicationContext中的后处理器可以通过配置和反射进行调用,从上可以看到Bean的生命周期相关接口很多,如果都实现很复杂。通常我们的业务都可以通过 init-method 和 destory-method 方法配置来解决。

