Spring Bean加载过程

10 篇文章 1 订阅

加载的时机

  • 非懒加载
    • 在refresh()的finishBeanFactoryInitialization()进行加载
  • 懒加载
    • 第一次调用beanFacoty.getBean()进行加载

执行getBean()加载

  • getBean()
    • doGetBean()
      • transformedBeanName(beanName)
        • 获取真正的BeanName 可能有别名
      • 从缓存获取
        • getSingleton(beanName)
          • 从缓存中获取
        • getObjectForBeanInstance(sharedInstance, name, beanName, null)
          • 如果能从缓存中获取,则判断是否为FactoryBean,并调用返回
      • 缓存中不存在Bean
        • isPrototypeCurrentlyInCreation(beanName)
          • Prototype模式的Bean 从当前创建Bean的缓存判断是否重复是否存在重复创建,如果是报重复依赖异常
          • 判断当前容器是否存在Bean定义,如果不存在则递归从parentBeanFactory中获取Bean
        • 存储XML配置文件的GernericBeanDefinition转换为RootBeanDefinition,如果指定BeanName,是子Bean的话同时会合并父类的相关属性
        • 获取当前Bean的dependsOn,基于depend-on属性或@DependsOn注解设定的
          • 判断是否存在重复依赖,如果有则抛异常
        • 如果是singleton 调用getSingleton(),传入createBean(beanName, mbd, args)的ObjectFactory参数
          • beforeSingletonCreation(beanName)

            • 记录加载状态,用于对循环依赖进行检测
            • 实际上记录到singletonsCurrentlyInCreation
          • singletonFactory.getObject()

            • 调用工厂创建Bean
            • createBean(beanName, mbd, args)
              • RootBeanDefinition.prepareMethodOverrides()
                • 提前验证当前Bean是否存在配置了look-up的Method
              • resolveBeforeInstantiation(beanName, mbdToUse)
                • 在生成Bean之前给一个机会生成代理Bean
                • 看是否存在InstantiationAwareBeanPostProcessor的类,执行BeanPostProcessors中的Before方法代理生成Bean
                • 如果生成了代理类 再调用 全局的BeanPostProcessors的After方法
              • doCreateBean(beanName, mbdToUse, args)
                • 实际创建执行的Bean
                • createBeanInstance(beanName, mbd, args)
                  • 逻辑极其复杂
                  • 通过反射或者cglib创建Bean
                  • 最后返回BeanWrapper
                • addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
              • 添加到SingletonFactory缓存中
                • getEarlyBeanReference
                  • 如果存在SmartInstantiationAwareBeanPostProcessor,则执行处理器
                  • 返回原始Bean
              • populateBean(beanName, mbd, instanceWrapper)
                • 给原始Bean 注入属性、依赖
              • initializeBean(beanName, exposedObject, mbd)
                • 执行Bean的初始化方法
                • applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName)
                  • BeanPostProcessor的Before方法
                • invokeInitMethods(beanName, wrappedBean, mbd)
                  • 如果继承了InitializingBean接口, 执行afterPropertiesSet()方法
                  • init-method
                • applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
                  • BeanPostProcessor的After方法
          • afterSingletonCreation(beanName);

            • singletonsCurrentlyInCreation 移除beanName
          • addSingleton(beanName, singletonObject)

            • 将当前单例Bean加入到缓存中,并删除加载Bean过程中所记录的各种辅助状态
            • 添加到 singletonObjects
            • 从singletonFactories移除
            • 从earlySingletonObjects移除
      • 返回单例Bean

循环依赖

  • 不支持循环依赖
    • 构造器初始化
    • prototype
      • IoC不进行缓存 无法解决循环依赖
  • 支持循环依赖
    • @Autowrie
    • Setter
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值