Springbean的生命周期

首先spring加载bean对象并不是根据bean的Class定义来创建bean对象的,在容器启动的时候,他会扫描bean的定义信息,扫描bean的定义信息是在refresh()方法里的invokeBeanFactoryPostProcessors()方法,在这个方法里边他会执行BeanFactoryPostProcessors后置处理器及其子接口BeanDefinitionRegistryPostProcessor,执行顺序是先执行BeanDefinitionRegistryPostProcessor接口的postProcessBeanDefinitionRegistry方法,然后执行BeanFactoryPostProcessor接口的postProcessBeanFactory方法

对于BeanDefinitionRegistryPostProcessor接口的rpostProcessBeanDefinitionRegistry方法,该步骤会扫描指定包下面的标有注解的类,然后将其变成BeanDefinition对象,然后放入到spring的BeanDefintionMap中,用于之后创建springbean的时候使用beanDefinition

其中registerBeanPostProcessors方法根据实现了PriorityOrdered,Ordered接口,排序后注册所有的BeanPostProcessor后置处理器,主要用于SpringBean创建的时候,执行这些后置处理器的方法,

然后 finishBeanFactoryInitialization是完成非懒加载的Spring bean的创建的工作,该步骤中会有8个后置处理的方法4个后置处理器的类贯穿在对象的实例化、赋值、初始化、和销毁的过程中

在这里插入图片描述

  1. 首先bean的创建调用的是createBean方法,createBean方法里一共有四个步骤

    • 根据设置的Class属性或者根据ClassName来解析Class——->resolveBeanClass(mbd,beanName);
    • 对override属性进行标记及验证——>mbd.prepareMethodOverrides();
    • 应用初始化前的后置处理器,解析指定bean是否存在代理,如果存在代理就返回代理对象来代替真正的实例——>resolveBeforeInstantiation(beanName,mbd) ; Aop就是在这里实现的
    • 如果没有代理,开始创建bean—–>doCreateBean(beanName,mbd,args);
  2. 实例化前的后置处理器

    InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation(beanClass,beanName)方法

    查找所有的InstantiationAwareBeanPostProcessor,依次调用InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation获取bean的实例对象,如果能够获取到,那么就将返回值作为当前bean的实例,那么spring自带的实例化bean的过程就被跳过了,如果能够获取到,那么下面的生命周期就不会执行了.

  3. SmartInstantiationAwareBeanPostProcessor# determineCandidateConstructors

    检测bean的构造器,可以检测出多个候选的构造器

    它有一个重要的实现类:AutowiredAnnotationBeanPostProfessor 作用:具体需要使用那个构造器,spring为开发者提供了一个接口,允许开发者自己来判断用哪个构造器 实现:返回候选的构造器列表,可以将构造器中标注了@Autowired注解的方法返回,用来查找一个最合适的创建bean的构造器

  4. 对象的实例化

  5. MergedBeanDefinitionPostProcessor# postProcessMergedBeanDefinition

    缓存bean的注入信息的后置处理器,仅仅是缓存或者干脆叫做查找更加合适,没有完成注入,注入是另外一个后置处理器的作用

  6. SmartInstantiationAwareBeanPostProcessor# getEarlyBeanReference

    循环引用的后置处理器,这个东西比较复杂, 获得提前暴露的bean引用。主要用于解决循环引用的问题,只有单例对象才会调用此方法,他能提前暴露bean。

  7. InstantiationAwareBeanPostProcessor# postProcessAfterInstantiation

    方法在目标对象实例化之后调用,这个时候对象已经被实例化,但是该实例的属性还未被设置,都是null。如果该方法返回false,会忽略属性值的设置;如果返回true,会按照正常流程设置属性值。方法不管postProcessBeforeInstantiation方法的返回值是什么都会执行

  8. 属性注入populateBean

    1. InstantiationAwareBeanPostProcessor处理器的postProcessAfterInstantiation函数的应用,此函数可以控制程序是否继续进行属性填充
    2. 根据注入类型(byName/byType),提取依赖的bean,并统一存入PropertyValues中
    3. 应用InstantiationAwareBeanPostProcessor处理器的postProcessPropertyValues方法,对属性获取完毕填充填对属性的再次处理
    4. 将所有的PropertyValues中的属性填充到BeanWrapper中.

    postProcessProperties方法会完成属性注入: 这个方法有两个重要的实现类 AutowiredAnnotationBeanPostProcessor在这个方法中对@Autowired @Value标注的字段,方法注入值. CommonAnnotationBeanPostProcessor在这个方法中对@Resource标注的字段和方法注入值

  9. 调用InvokeAwareMethods方法

    调用invokeAwareMethods方法,判断该bean是否为BeanNameAware,BeanClassLoaderAware,BeanFactoryAware的子类,然后执行相应的setBeanName,setBeanFactory,setClassLoader方法

  10. BeanPostProcessor# postProcessBeforeInitialization

    该方法会在初始化之前执行,其中有一个比较重要的实现类ApplicationContextAwareProcessor,该后置处理器的一个作用就是当应用程序定义的Bean实现ApplicationContextAware接口时注入ApplicationContext对象

    如果当前方法返回null,该方法结束,这个方法也称为bean初始化前操作

    ApplicationContextAwareProcessor:

    ​ 如果bean实现EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware、ApplicationContextAware接口,那么在ApplicationContextAwareProcessor#postProcessBeforeInitialization会依次调用接口中的方法,将Aware前缀对应的对象注入到bean实例中

    CommonAnnotationBeanPostProcessor:

    ​ CommonAnnotationBeanPostProcessor#postProcessBeforeInitialization中会调用bean中所有标注@PostConstruct注解的方法

  11. 激活用户自定义的初始化方法#invokeInitMethods(初始化)

    初始化阶段分为两个过程

    1. 如果bean实现了InitializingBean接口,就执行其afterPropretiesSet方法,进行bean的初始化

    2. 调用bean定义的时候指定的初始化方法

      方式一:xml方式指定初始化方法

      方式二:@Bean的方式指定初始化方法@Bean(initMethod=“初始化方法”)

      方式三:api的方式指定初始化方法 this.beanDefinition.setInitMethodName(methodName)

  12. BeanPostProcessor# postProcessAfterInitialization

     该后置处理器的执行是在调用init方法后面进行执行,主要是判断该bean是否需要被AOP代理增强,如果需要的话,则会在该步骤返回一个代理对象。
    
  13. SmartInitializingSingleton# afterSingletonsInstantiated

    该方法会在所有的非懒加载单实例bean都成功创建并且放到Spring IOC容器之后,依次遍历所有的bean,如果当前这个bean是SmartInitializingSingleton的子类,那么就强转成SmartInitializingSingleton类,然后调用SmartInitializingSingleton的afterSingletonsInstantiated方法

  14. 注册DisposableBean

    spring中不但提供了对初始化方法的扩展入口,同样也提供了销毁方法的扩展入口,对于销毁方法的扩展,除了我们熟知的配置属性destroy-method方法外,用户还可以注册后置处理器DestructionAwareBeanPostProcessor来统一处理bean的销毁方法.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值