Spring 4 bean的生命周期

Spring 4 bean的生命周期,笔者总结为四个阶段:

1. Bean定义阶段

2. Bean实例化阶段

3. Bean初始化阶段

4. Bean销毁阶段

 

bean的定义阶段

SpringIOC提供了多种方式作bean的定义:

           最为常见的就是通过@Componenet等注解、xml配置的<bean>

           高级一点方式:@Import导入 ImportBeanDefinitionRegistrar的实现类

           还有就是直接通过BeanFactory注册

其底层都是去注册一个BeanDefinition

为了拓展,Spring还提供了多种后置处理(PostProcessor),其中 BeanFactoryPostProcessor就是工作在这个阶段的。那么来看看,BeanFactoryPostProcessor的体系:

BeanDefinitionRegistryPostProcessor只有一个接口方法:

      void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)

      可以对BeanDefinition进行增删改查(其实就是入参提供的能力)

BeanFactoryPostProcessor也只有一个接口方法:

      void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)

      同样地,入参beanFactory决定的这个接口方法能做什么(自行参考SpringAPI)

注意:在这个阶段,所有的bean都还没有实例化,只是存在Bean定义。

 

Bean实例化阶段

先来看看BeanPostProcessor体系:

SmartInstantiationAwareBeanPostProcessor 主要是给框架内部使用的,推荐使用其父接口。代理织入的时候使用到了参考:      AbstractAutoProxyCreator。可以预测对象类型,指定构造器,获取早期对象。

InstantiationAwareBeanPostProcessor同样在这个阶段工作。

        postProcessBeforeInstantiation如果返回了一个实例,将意味着实例化完成,直接跳过依赖注入,到BeanPostProcessor.postProcessAfterInitialization(所以代理在这里织入,因为postProcessBeforeInitialization不能保证所有的bean实例都经过)。

        postProcessAfterInstantiation(Object bean, String beanName)如果返回true,则由容器注入属性。但是如果上面返回了实例,则不会被执行到。

        postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName)

可以作属性检查,检查是否所有的属性都已注入。

 

DestructionAwareBeanPostProcessor

        用于销毁对象,例如调用对象的销毁方法,释放连接资源。

 

MergedBeanDefinitionPostProcessor

        合并父子上下文Bean定义

 

一般的实例化流程:

1. 根据beanDefinition,选择实例化方式(静态构造方法、FactoryBean、无参构造器等)。

2. AutowiredAnnotationBeanPostProcessor.postProcessAfterInstantiation(返回true)

3. 设置属性——依赖注入(构造器注入不能解决循环依赖)

AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues

 

Bean初始化阶段

1. 调用BeanNameAware修改当前bean的名字

2. 调用BeanClassLoaderAware注入BeanClassLoader

3. 调用BeanFactoryAware注入BeanFactory

4. BeanPostProcessor.postProcessBeforeInitialization

        InitDestroyAnnotationBeanPostProcessor调用@PostConstruct注解的初始方法

        ApplicationContextAwareProcessor注入ApplicationContext相关的bean

   

(这里需要注意:InitDestroyAnnotationBeanPostProcessor是实现PriorityOrdered,而 ApplicationContextAwareProcessor没有指明,默认Ordered#LOWEST_PRECEDENCE)

         其他BeanPostProcessor的处理

5. 调用InitializingBean#afterPropertiesSet

6. 调用用户自定义的初始化方法。例如通过@Bean(initMethod="")指定

7. BeanPostProcessor#postProcessAfterInitialization

          AnnotationAwareAspectJAutoProxyCreator织入代理

          其他BeanPostProcessor的处理

8. 保存到一级缓存DefaultSingletonBeanRegistry#singletonObjects。如果定义了销毁方法,则注册到DefaultSingletonBeanRegistry#disposableBeans包含指定destory方法,实现了DisposableBean接口的。

 

另外Lifecycle接口的实现bean是在所有的bean都已经实例化完成,放到缓存之后,统一由DefaultLifecycleProcessor去调度的。

到这里所有的bean就已经准备就绪,处于可用状态了。

 

Bean销毁阶段

Bean的销毁没怎么仔细研究。大体就是通过

在DisposableBeanAdapter#destroy 调用所有的DestructionAwareBeanPostProcessor.postProcessBeforeDestruction(Object bean, String beanName),其中@PreDestroy由InitDestroyAnnotationBeanPostProcessor处理。

实际上在注册DisposableBean时,注册的就是将bean封装成DisposableBeanAdapter

 

注:Spring容器中的单例对象,由于一直存在引用,所以是不会被JVM识别为垃圾对象的。会一直存在,直到应用被停止,由Spring去清理。又或者通过ConfigurableBeanFactory来调用destroyBean等方法移除。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值