浅谈Bean的生命周期

Spring的Bean生命周期

容器启动之后,并不会马上就实例化相应的bean定义。我们知道,容器现在仅仅拥有所有对象的BeanDefinition 来保存实例化阶段将要用的必要信息。只有当请求方通过 BeanFactory 的 getBean()方法来请求某个对象实例的时候,才有可能触发Bean实例化阶段的活动。 BeanFactory 的 getBean()法可以被客户端对象显式调用,也可以在容器内部隐式地被调用。隐式调用有如下两种情况:
1.对于 BeanFactory 来说,对象实例化默认采用延迟初始化。
2.ApplicationContext 启动之后会实例化所有的bean定义。但 ApplicationContext 在实现的过程中依然遵循Spring容器实现流程的两个阶段,只不过它会在启动阶段的活动完成之后,紧接着调用注册到该容器的所有bean定义的实例化方法getBean() ,当你得到 ApplicationContext 类型的容器引用时,容器内所有对象已经被全部实例化完成。
实例化过程如图所示。
浅谈Bean的生命周期_第1张图片

bean生命周期

  1. 容器在内部实现的时候,采用“策略模式(Strategy Pattern)”来决定采用何种方式初始化bean实例。容器只要根据相应bean定义的 BeanDefintion 取得实例化信息,结合 CglibSubclassingIns-tantiationStrategy 以及不同的bean定义类型,就可以返回实例化完成的对象实例。但是,返回方式上有些“点缀”。不是直接返回构造完成的对象实例,而是以 BeanWrapper 对构造完成的对象实例进行包裹,返回相应的 BeanWrapper 实例。
  2. BeanWrapper 定义继承了 org.springframework.beans.PropertyAccessor 接口,可以以统一的方式对对象属性进行访问; BeanWrapper 定义同时又直接或者间接继承了 PropertyEditorRegistry和 TypeConverter 接口。使用 BeanWrapper 对bean实例操作很方便,可以免去直接使用Java反射API(Java Reflection API)操作对象实例的烦琐。
    BeanWrapper newsProvider = new BeanWrapperImpl(provider); newsProvider.setPropertyValue("newsListener", listener); newsProvider.setPropertyValue("newPersistener", persister);
  3. 当对象实例化完成并且相关属性以及依赖设置完成之后,Spring容器会检查当前对象实例是否实现了一系列的以 Aware 命名结尾的接口定义。如果是,则将这些 Aware 接口定义中规定的依赖注入给当前对象实例。主要的接口:BeanNameAware、 BeanClassLoaderAware、BeanFactoryAware。。。
  4. BeanPostProcessor 会处理容器内所有符合条件的实例化后的对象实例。该接口声明了两个方法,分别在两个不同的时机执行。
    Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException; Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
    ApplicationContext 对应的那些 Aware 接口实际上就是通过 BeanPostProcessor 的方式进行处理的。当 ApplicationContext 中每个对象的实例化过程走到 BeanPostProcessor 前置处理这一步时, ApplicationContext 容器会检测到之前注册到容器的 ApplicationContextAwareProcessor 这个 BeanPostProcessor 的实现类,然后就会调用其 postProcessBeforeInitialization() 方法,检查并设置 Aware 相关依赖。
  5. 在对象实例化过程调用过“BeanPostProcessor 的前置处理”之后,会接着检测当前对象是否实现了 InitializingBean 接口,如果是,则会调用其afterPropertiesSet() 方法进一步调整对象实例的状态。
  6. 通过自定义或默认的init-method初始化bean。
  7. 自定义destroy-method。
    至此,bean的生命周期结束了。

你可能感兴趣的:(Java,Spring及原理)