Spring中bean生命周期完整过程


集体过程

  1. 当调用者通过getBean(beanName)想容器请求某个Bean时,如果容器注册了org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor接口,则在实例化Bean之前,将调用接口postProcessBeforeInstantiation()方法。
  2. 根据配置调用Bean构造函数或者工厂方法实例化Bean
  3. 如果容器注册了InstantiationAwareBeanPostProcessor接口,那么在实例化Bean之后,调用接口中的postProcessAfterInstantiation()方法,在这里可以对实例化的Bean进行“梳妆打扮”。
  4. 如果Bean配置的属性信息,那么容器将在这一步着手将配置值设置到Bean对应的属性中,不过设置每个属性之前调用postProcessPropertyValues()方法。
  5. 调用Bean的属性设置方法设置属性值
  6. 如果Bean实现了org.springframework.beans.factory.BeanNameAware接口,则将调用setBeanName()接口方法,将配置文件中该Bean对应的名称设置到Bean中。
  7. 如果Bean实现了org.springframework.beans.BeansException.BeanFactoryAware接口,则调用setBeanFactory()接口方法,将BeanFactory容器实例设置到Bean中。
  8. 如果BeanFactory装配了org.springframework.beans.factory.config.BeanPostProcessor后处理器,则调用BeanPostProcessor的Object postProcessBeforeInitialization(Object bean,String beanName)接口方法对Bean进行加工操作。其中bean是当前正在处理的Bean,而beanName是当前Bean的配置名,返回的对象为加工处理后的Bean。用户可以使用该方法对某些Bean进行特殊的处理,甚至改变Bean的行为。BeanPostProcessor在Spring框架中占有重要位置,为容器提供对Bean进行后续加工处理的切入点,Spring容器所提供的各种“神奇功能”(如AOP、动态代理)都是通过BeanPostProcessor实施。
  9. 如果Bean实现了InitializingBean接口,则将调用接口的afterPropertiesSet()方法。
  10. 如果在<bean>中通过init-method属性定义了初始化方法,则将执行这个方法。
  11. BeanPostProcessor后处理器定义了两个方法:其一是psotProcessBeaforeInitialization(),再第8步调用;其二是Object postProcessAfterInitialization(Object bean,String beanName),这个方法在此调用,容器再次获取对Bean进行加工处理的机会。
  12. 如果<bean>中指定Bean的作用范围为scope="prototype",则将Bean返回给调用者,调用者负责Bean后续的生命周期,Spring不再管理这个Bean的生命周期。如果将作用范围设为scope="singleton",则将Bean放入Spring IoC容器的缓存池中,并将Bean引用返回给调用者,Spring继续对这些Bean后续的生命管理。
  13. 对于scope="singleton"的Bean(默认情况),当容器关闭是,将触发Spring对Bean后续生命周期的管理工作。如果Bean实现了DisposableBean接口,则将调用节后的destory()方法,可以再次编写释放资源、记录日志等操作。
  14. 对于scope="singleton"的Bean,如果通过<bean>的destory-method属性指定了Bean的销毁方法,那么Spring将执行Bean的这个方法,完成Bean资源的释放等操作。   
            

猜你喜欢

转载自blog.csdn.net/hello_it_/article/details/80705324