Spring源码 - BeanDefinition

  • bean定义子元素

    • lookup-method

      获取器注入,配置一个获取某个get bean的 abstract 方法的实际返回值

    • replaced-method

      可以在运行时调用新的方法替换现有方法,还能动态更新现有方法的实现逻辑

  • 自定义标签解析器,根据不同的标签使用对应的解析器(工厂方法 BeanDefinitionParser.parse())

    • advice TxAdviceBeanDefinitionParser
    • annotation-driven AnnotationDrivenBeanDefinitionParser
    • jta-transaction-manager JtaTransactionManagerBeanDefinitionParser
    • property-placeholder PropertyPlaceholderBeanDefinitionParser
    • property-override PropertyOverrideBeanDefinitionParser
    • annotation-config AnnotationConfigBeanDefinitionParser
    • component-scan ComponentScanBeanDefinitionParser
    • load-time-weaver LoadTimeWeaverBeanDefinitionParser
    • spring-configured SpringConfiguredBeanDefinitionParser
    • mbean-export MBeanExportBeanDefinitionParser
    • mbean-server MBeanServerBeanDefinitionParser
  • 循环依赖

    • 两个或两个以上bean互相引用,形成闭环;

      spring将bean的创建分三个过程:创建实例(构造器、工厂方法实现)、属性填充(注入)、调用初始化方法init-method;

    • singleton bean三级缓存

      • singletonFactories 三级缓存单例对象工厂(FactoryBean)cache,重写getObject(),返回bean
      • earlySingletonObjects 二级缓存提前曝光的单例对象cache
      • singletonObjects 一级缓存单例对象cache
    • 构造器循环依赖(Spring解决不了,抛出异常)

      A的构造器参数依赖B,B的构造器参数依赖A;在A创建实例时会先初始化依赖B,初始化B是又去初始A,造成循环依赖

    • setter循环依赖(三级缓存)

      A属性依赖B,B属性依赖A;A创建实例后将Spring将A的FactoryBean放入三级缓存singletonFactories,
      之后进行属性填充,发现存在属性依赖B,前去获取创建B创建实例后同样将B放入三级缓存singletonFactories中,
      之后进行属性填充,发现存在依赖A,获取A时从singletonFactories获取到A的FactoryBean,通过FactoryBean
      获取到A的实例引用,属性填充完成,B创建完成,A获取到B的实例引用,创建完成

  • 自动装箱

    • 在创建bean的三个过程中,当创建实例(构造器、工厂方法实现)后会执行applyMergedBeanDefinitionPostProcessors(),
      遍历所有BeanPostProcessors执行postProcessMergedBeanDefinition(),每种BeanPostProcessor根据不同的注解
      去查找bean的属性进行自动封装
      • AutowiredAnnotationBeanPostProcessor @Autowire @Value
      • CommonAnnotationBeanPostProcessor @Resource
      • RequiredAnnotationBeanPostProcessor @Required
  • bean初始化流程

    • 遍历 beanDefinitionNames 解析过的 beanDefinition --> DefaultListableBeanFactory.preInstantiateSingletons()

    • AbstractBeanFactory.getBean(beanName)

    • AbstractBeanFactory.doGetBean(final String name, final Class requiredType, final Object[] args, boolean typeCheckOnly)

    • 获取缓存中提前曝光的 ObjectFactory sharedInstance = AbstractBeanFactory.getSingleton(beanName)

      • 从一级缓存 singletonObjects 中获取
      • singletonObjects 中获取不到 从二级缓存 earlySingletonObjects 中获取
      • earlySingletonObjects 中获取不到 从三级缓存 singletonFactories 中获取
      • singletonFactories 中获取后删除 移到二级缓存 earlySingletonObjects
    • sharedInstance != null 执行bean的获取 AbstractBeanFactory.getObjectForBeanInstance(sharedInstance, name, beanName, null)

      • 如果 sharedInstance 不是 FactoryBean 直接返回
      • 从 FactoryBean 获取到的 bean 的缓存 factoryBeanObjectCache 获取bean
      • FactoryBeanObjectCache 中获取不到 将 sharedInstance 转成 FactoryBean 获取 bean
      • 将 (FactoryBean)sharedInstance 获取到的 bean 放入 FactoryBeanObjectCache
      • 过程中 如果 factoryBeanObjectCache 或 FactoryBean 获取到bean 执行 postProcessObjectFromFactoryBean(object, beanName)
    • sharedInstance == null 执行bean的创建

      • 返回父类 BeanFactory.getBean() 获取的到bean
      • 递归整合包含父类的 RootBeanDefinition 遍历获取依赖 从 AbstractBeanFactory.getBean(beanName) 重新开始初始化流程
      • AbstractAutowireCapableBeanFactory.createBean()
  • bean的作用域

    • singleton:单例模式,容器中仅存一个,默认的
    • prototype:多例模式,每次调用(getBean())都会创建新的实例
    • request:每次http请求都会创建,仅适用于WebApplicationContext环境
    • session:同一http session共享,仅适用于WebApplicationContext环境
    • globalSession:用于portlet应用环境,仅适用于WebApplicationContext环境
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值