spring bean 的生命周期和配置源信息

spring的bean的生命周期

spring的bean在容器中的生命周期如下:

1 spring bean 的元信息配置阶段
2 spring bean的元信息解析阶段
3 spring bean 的注册阶段
4 spring BeanDefinition合并阶段
5 spring Bean class加载阶段
6 spring Bean的实例前阶段
7 spring bean的实例化阶段
9 spring bean的实例化后阶段
9 spring bean属性赋值前阶段(被注入之前)
10 springbean的Aware接口回调阶段
11 springbean的初始化前阶段
12 spring bean的初始化阶段
13 spring bean的初始化后阶段
14 pring bean的初始化后完成阶段
15 spring bean 销毁前阶段
15 spring bean 销毁阶段

1 spring bean 的元信息配置阶段

 


2 spring bean的元信息解析阶段

 


3 spring bean 的注册阶段

 


4 spring BeanDefinition合并阶段

 


5 spring Bean class加载阶段

 


6 spring Bean的实例前阶段

InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation 
 这个类也是BeanPostProcessor,可以通过BeanFactory.addBeanPostProcessor添加  这个方法是非主流的方法,这个方法会返回一个object,如果返回null,则会根据beandefinition进行初始化,如果返回对象,则不会实例化调用doCreateBean方法

这个方法可以创建代理类(尤其是适合生成可以远程调用的代理类)

这个方法会在AbstyractAutowireCapableBeanFactory中的resolveBeforeInstantiation-》resolveBeforeInstantiation-》applyBeanPostProcessorsBeforeInstantiation方法中被调用,


7 spring bean的实例化阶段

InstantiationStrategy里面有一个方法instantiate, SimpleInstantionStrategy实现Instantiation,而CglibSubClassingInstantiationStrategy继承SimpleInstantionStrategy

方法经过AbstractAutowireCapableBeanFactory.doGreateBean->createBeanInstance->


9 spring bean的实例化后阶段

InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation(),如果返回false,则不会进行从beanDefinition里面的属性赋值


9 spring bean属性赋值前阶段(被注入之前)

不同版本有不同的回调接口

spring1.2-5.0,InstantiationAwareBeanPostProcessor.postProcessPropertyValue

spring5.1:InstantiationAwareBeanPostProcessProcessor.postProcessProperties,如果返回null,则表示不修改,否则返回赋值PropertySources 然后赋值给对象

 


10 springbean的Aware接口回调阶段

这个阶段属于bean的初始化阶段,Aware接口回调顺序,因为这些方法也在doCreateBean中 ,而且在springboot中有一部分Aware主要通过ApplicationContextAwareProcessor的postProcessBeforeInitialization处理,这个和springbean的初始化前阶段相似

BeanNameAware,BeanClassLoaderAware,  BeanFactoryAware

EnvironmentAware  EmbeddeValueResolverAware  ResourceLoaderAware  ApplicationEentPushlisherAware  MessaegSourceAware  ApplicationContextAware,这几个是属于ApplicationContext生命周期中的,需要在ApplicationContextAwareProcessor中被调用


11 springbean的初始化前阶段

事实上AbstractBeanFactory里面有一个BeanPostProcessList,这个是个有序的,而且AbstractApplicaltionContext在prepareBeanFactory中就add ApplicationContextAwareProcessor,所以ApplicationContextAwareProcessor是所有BeanPostProcessor中第一个执行postProcessBeforeInitialization,所以其流程如下

AbstractAutowireCapableBeanFactory#doCreateBean  -》 AbstractAutowireCapableBeanFactory#initializeBean(String, Object, RootBeanDefinition)-》AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization

Object[新对象] postProcessBeforeInitialization(Object originalbean, String beanName)

这个方法如果返回null,则不修改这个bean,而如果返回新对象,则会用新对象替换老对象

方法流程如下AbstractAutowireCapableBeanFactory#doCreateBean  -》 AbstractAutowireCapableBeanFactory#initializeBean(String, Object, RootBeanDefinition)-》AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization


12 spring bean的初始 化阶段

bean的初始化顺序是@PostConstruct->InitializingBean.afterPropertiesSet->@Bean(initMethod)

@PostConstruct这个注解需要BeanPostProcessor驱动,具体驱动是CommonAnnotationBeanPostProcessor的postProcessBeforeInitialization

而initialingBean合initMethod都是在AbstractAutowireCapableBeanFactory#doCreateBean  -》 AbstractAutowireCapableBeanFactory#initializeBean(String, Object, RootBeanDefinition)-》AbstractAutowireCapableBeanFactory#invokeInitMethods,而invokeInitMethod恰好在applyBeanPostProcessorsBeforeInitialization之后执行的


13 spring bean的初始化后阶段

BeanPostProcessor.postProcessAfterInitialization,方法和postPorcessAfterInitialization


14 pring bean的初始化后完成阶段

方法回调需要基于spring 4.1+版本支持

SmartInitializingSingleton#void afterSIngletonInstantiated()

这个方法通常需要在spring appliclationContext场景下使用是在AbstractApplicationContext中的refresh ->finishBeanFactoryInitialization中执行

这个是当所有的beanDefinition变成bean的时候就会调用,这个回调是当bean已经完全初始化了才会调用


15 spring bean 销毁前阶段

 


15 spring bean 销毁阶段

 

spring的配置元信息

spring的BeanDefinition有三种GenericBeanDefinition,RootBeanDefinition以及AnnotatedBeanDefinition

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值