文章目录
- BeanDefinition类图关系
- 概述
- 关于MergedLocalBeanDefinition和ChildBeanDefinition
- 总结
BeanDefinition类图关系
概述
- AbstractBeanDefinition 抽象公共定义
常用 | 定制 |
RootBeanDefinition: 不能设置parent | AnnotatedGenericBeanDefinition有注释的bean定义 |
| 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
- 但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三个注解,强调扫描