当前位置: 首页 > article >正文

BeanDefinition体系架构(待...)

AbstractBeanDefinition 仅仅只有三个直接的子类,分别是:RootBeanDefinitionChildBeanDefinitionGenericBeanDefinition

注:在 Spring2.5 之前,仅仅只有 RootBeanDefinition、ChildBeanDefinition 两个子类,
在这里插入图片描述
我们一般通过 RootBeanDefinition 来定义一个 Bean 对象,但是有时候会出现这么一种情况:

RootBeanDefinition bd1 = new RootBeanDefinition();
bd1.setBeanClassName( "com.test1" );
bd1.setScope( BeanDefinition.SCOPE_SINGLETON );
....
    
RootBeanDefinition bd2 = new RootBeanDefinition();
bd2.setBeanClassName( "com.test2" );
bd2.setScope( BeanDefinition.SCOPE_SINGLETON );
....
    
RootBeanDefinition bd3 = new RootBeanDefinition();
bd3.setBeanClassName( "com.test3" );
bd3.setScope( BeanDefinition.SCOPE_SINGLETON );
....

由上述定义可以看到,这些 BeanDefinition 会有相同的设置(setScope( “singleton” )),从而造成冗余,于是 Spring 就使用了一种 伪继承 模式:

我们可以将多个 BeanDefinition 的公共部分放置在一个 RootBeanDefinition 中,然后创建多个 ChildBeandefinition,并且指定 parent 为 RootBeanDefinition 即可,如下:

RootBeanDefinition rootBeanDefinition = new RootBeanDefinition();
rootBeanDefinition.setScope( BeanDefinition.SCOPE_SINGLETON );
rootBeanDefinition.setLazyInit( false );
rootBeanDefinition.setAbstract( true ); // 设置为抽象的, 则在创建bean对象的时候不会被创建
context.registerBeanDefinition( "root", rootBeanDefinition );

ChildBeanDefinition childBeanDefinition1 = new ChildBeanDefinition( "root" ); // 指定parent为"root"
childBeanDefinition1.setBeanClass( TestClass1.class );
context.registerBeanDefinition( "child1", childBeanDefinition1 );

ChildBeanDefinition childBeanDefinition2 = new ChildBeanDefinition( "root" ); // 指定parent为"root"
childBeanDefinition2.setBeanClass( TestClass2.class );
context.registerBeanDefinition( "child2", childBeanDefinition2 );

通过上述的方式,就可以将一些公共的设置给抽离出来了,从而使得 RootBeanDefinition 既可以独立成 一个 bean 定义,也可以作为多个 bean 定义的父类,

而 ChildBeanDefinition 则可以指定 parent 为 root 来共享公共的定义

在 Spring2.5 以后,Spring 又定义了一个 GenericBeanDefinition,从而打破了原来 RootBeanDefinition 以及 ChildBeanDefinition 的弊端(替代 ChildBeanDefinition):

ChildBeanDefinition 在创建时必须指定 parent,而 RootBeanDefinition 又不能有 parent(它的 setParentName() 方法会抛出异常)

即 GenericBeanDefinition 比 ChildBeanDefinition、RootBeanDefinition 更加灵活,既可以单独作为 BeanDefinition,也可以作为父 BeanDefinition,还可以作为子 BeanDefinition。所以 GenericBeanDefinition 也称为 “通用的 BeanDefinition”

我们在使用 Spring 的时候可以知道,在一个 Bean 对象是可以定义一些注解的,比如我们可以自定义一个 @Hello 注解,那么一个 GenericBeanDefinition 是没法存储下这些注解的信息的,

于是为了能够存储注解信息,GenericBeanDefinition 又衍生出了两个子类,分别是:AnnotatedGenericBeanDefinition、ScannedGenericBeanDefinition,

参考博客:https://juejin.cn/post/6844904167933231117


http://www.kler.cn/a/379015.html

相关文章:

  • ArcGIS005:ArcMap常用操作101-150例动图演示
  • 上市公司环境信息披露质量评分数据王婉菁版(2008-2023年)噪声光污染辐射废水减排等治理
  • RabbitMQ的原理和集成使用
  • Puppeteer点击系统:解锁百度流量点击率提升的解决案例
  • 有向无环图的拓扑排序——CSP-J1真题讲解
  • 摩尔斯电码
  • 大数据挖掘和数据挖掘有什么不一样?
  • (C#面向初学者的 .NET 的生成 AI) 第 2 部分-什么是 AI 和 ML?
  • Nginx 实现动态封禁IP,详细教程来了
  • Linux特种文件系统--tmpfs文件系统
  • yarn : 无法加载文件,未对文件 进行数字签名。无法在当前系统上运行该脚本。
  • [Android]从FLAG_SECURE禁止截屏看surface
  • 雷电模拟器ls内部操作adb官方方法
  • VScode + PlatformIO 了解
  • WMV怎么转MP4?五个简单好用的视频格式转换方法!
  • Faces in Things数据集: 由麻省理工学院、微软等联合发布,探索人类视觉错觉的新里程碑
  • 每日OJ题_牛客_最长上升子序列(二)_贪心+二分_C++_Java
  • 做一个能适配「手机」的网站需要注意什么
  • 匹配——rabin_karp是怎么滚动的?
  • 多波束T50P和SES2000 Medium100安装记录(2024年10月)
  • Android 斗鱼面经
  • flutter 打包
  • 2024年华为OD机试真题-VLAN资源池-Java-OD统一考试(E卷)
  • 存在sql注入的公网站点
  • selenium无头浏览器截图并以邮件发送
  • C++学习笔记----10、模块、头文件及各种主题(一)---- 模块(1)