文章目录

  • ​​BeanDefinition类图关系​​
  • ​​概述​​
  • ​​关于MergedLocalBeanDefinition和ChildBeanDefinition​​
  • ​​总结​​

BeanDefinition类图关系

spring核心源码分析第八篇 refresh流程之invokeBeanFactoryPostProcessors-BeanDefinition分类_java

概述

  • AbstractBeanDefinition 抽象公共定义

常用

定制

RootBeanDefinition: 不能设置parent

AnnotatedGenericBeanDefinition有注释的bean定义

ChildBeanDefinition

ConfigurationClassBeanDefinition 通过ConfigurationClassBeanDefinitionReader解析的BeanDefinition

GenericBeanDefinition: 无特殊要求

ScannedGenericBeanDefinition 通过ClassPathScanningCandidateComponentProvider扫描类路径得到的BeanDefinition

AnnotatedGenericBeanDefinition和ScannedGenericBeanDefinition区别与联系:

  • ScannedGenericBeanDefinition更强调基于classpath扫描发现,所以其只会在ClassPathScanningCandidateComponentProvider.scanCandidateComponents里被创建,并且只针对[Component ManagedBean Named]三个注解
  • AnnotatedGenericBeanDefinition表示除去组件扫描外的场景,比如通过@Indexed[其实现方式大家可以百度] @Import等
  • 两者都表示带有注解的BeanDefinition,功能类似使用场景不同

关于MergedLocalBeanDefinition和ChildBeanDefinition

  • 如下图: Hi6有个parent属性 那么其从理论来说就是一个有父子关系的BeanDefinition
<bean id="hi6" class="com.mockuai.oms.admin.Hi6" parent="hi5">
<property name="addr" value="1"></property>
<property name="idCard" value="1"></property>
<property name="configCUser" ref="configCUser"></property>

</bean>
<bean id="hi5" class="com.mockuai.oms.admin.Hi5" >
<property name="id" value="12"></property>
</bean>
  • 但spring5.x[作者阅读]当前并没有使用ChildBeanDefinition,而是采用merge的方式
  • MergedLocalBeanDefinition是一个逻辑概念,其实现是RootBeanDefinition的覆盖,如下代码:

也就是通过覆盖将自己的BeanDefinition属性覆盖到父BeanDefinition从而得到一个逻辑的MergedLocalBeanDefinition
mbd = new RootBeanDefinition(pbd);
mbd.overrideFrom(bd);

总结

  • 一般自定义可以使用GenericBeanDefinition
  • AnnotatedBeanDefinition表示带有注解的BeanDefinition,AnnotatedGenericBeanDefinition和ScannedGenericBeanDefinition都是内置的处理注解的BeanDefinition,而ScannedGenericBeanDefinition针对的是类路径扫描,处理Component ManagedBean Named三个注解,强调扫描