• Spring5.2.x05SpringBean生命周期


    1. 类似new了一个对象

    2. 先填充@Autowired的属性注入

    3. 再填充自动注入的属性注入(如果改了注入模型模型)

    4. new一个对象(只是对象, 无注入)
      AbstractAutowireCapableBeanFactory里instanceWrapper = createBeanInstance(beanName, mbd, args);

    5. 属性填充, 不断遍历BeanDefinition, 看是否有实现相应的接口, 做了扩展
      2.1 执行实现MergedBeanDefinitionPostProcessor的BeanPostProcessor
      默认有2个, 一个是CommonAnnotationBeanPostProcessor, 一个是AutowiredAnnotationBeanPostProcessor
      AutowiredAnnotationBeanPostProcessor构建了一个注入器, 做了一个缓存

    2.2 实现InstantiationAwareBeanPostProcessor的BeanPostProcessor

    • ConfigurationClassPostProcessor 代理对象才增强
    • CommonAnnotationBeanPostProcessor 注入
    • AutowiredAnnotationBeanPostProcessor 注入

    applyPropertyValues(beanName, mbd, bw, pvs); 改变注入模型, 自动注入


    总体分为:

    1. 容器启动阶段
      扫描/实例化bd对象
      注册BeanPostProcessor
      验证bd是否合格(普通bean/原型/抽象/懒加载等)

    2. bean的对象实例化方法
      推断实例化方法
      实例化对象

    3. bean的属性注入阶段
      提前暴露/循环依赖做支持
      查找注入信息
      判断是否需要完成属性注入
      完成注解解析的属性输入

    4. bean的初始化阶段
      各种aware接口的回调
      各种初始化方法的回调
      对bena的各种扩展(后置处理器) aop

    此时是完整的bean

    1. bean的缓存阶段
      各种临时变量的删除
      缓存到单例池

    2. bean的销毁阶段
      销毁方法的回调
      移除单例池

    循环依赖

    理论上只要2种, 一种是半成品的bean, 一种是成品的bean, 在循环依赖的时候给半成品bean就行, 但问题是有时候会在回调里直接调用半成品的某些方法, 而这个方法又被aop切面了...

    三级缓存: objectFactory缓存, 万一需要对bean做扩展(如代理), 所以给的factory
    二级缓存: earlySingletonObjects三级缓存的factory做好处理后的半成品bean
    二级和三级缓存, 半成品只会有1个, 因为可能有多次循环, 就不用重复创建bean, 只要拿二级缓存的bean就行了

    一级缓存: singletonObjects, 成品bean

  • 相关阅读:
    Extjs4 MVC Controller中refs使用
    Mac下下载android4.2源码,进行源码调试
    来博客园一年三个月
    今天写的比较多
    Extjs4 MVC 添加view层
    mac自带vim7配置
    动态测试及调试工具
    等价类划分的延伸
    用javascript进行测试用例的验证
    同行评审在软件测试中的应用
  • 原文地址:https://www.cnblogs.com/richardhaha/p/16574786.html
Copyright © 2020-2023  润新知