【十二】图解 Spring 核心数据结构:BeanDefinition
图解 Spring 核心数据结构:BeanDefinition
简介
使用spring框架的技术人员都知道spring两个大核心技术IOC和AOP,随着投入更多的时间去学习spring生态,越发觉得spring的发展不可思议,一直都是引领着Java EE的技术变革,这样一系列优秀的框架我们应该花多一点时间去深入思考spring生态的发展,学习spring中优秀的设计思想。以前学习spring我们都是梳理一下spring bean的生命周期,debug一下spring aop的源码,最近想想感觉完全不够深入,所以近期想着出一系列文章,以图解的方式细致入微的去理解spring的每一个细节,本篇将围绕BeanDefinition的设计这一细节展开讲解,希望对读者有所启发。
一、spring bean是什么
使用了这么久的spring框架,那么spring bean是什么呢?我们都知道spring ioc会载入和管理我们的bean,我理解bean实际就是我们程序中使用的对象,初学spring的时候经常被问到不用spring我们是怎么开发的?没有spring我们使用对象的时候自己new,一旦该对象不再被使用,则由 Java 自动进行垃圾回收。简单的描述我们是不是感觉spring bean没什么神秘了,就是我们new的对象。
Spring 中的对象是 bean,bean实际上就是我们new的对象,只不过 Spring 不再自己去 new 对象了,而是由 IoC 容器去帮助我们实例化对象并且管理它,我们需要哪个对象,到IoC 容器里获取即可。IoC 其实就是解决对象之间的耦合问题,Spring Bean 的生命周期完全由容器控制。
我们对spring bean有了一些概念之后,那我们是否好奇spirng bean是以什么新式存储的呢?
二、BeanDefinition的设计
在Spring框架中定义了一个BeanDefinition接口,用于描述和配置Spring容器中的Bean,用于定义Bean的配置元数据,包括类名、作用域、构造函数参数、属性值、初始化方法、销毁方法和依赖关系等信息,BeanDefinition提供了一种抽象,使得开发者能够以声明性的方式描述如何实例化、配置和组装一个特定的Bean。
随着技术的发展,BeanDefinition接口得到了极大的发展丰富,继承体系如下图所示:
(1)、AttributeAccessor: 提供对 BeanDefinition 属性操作能力。
(2)、AttributeAccessorSupport: 使用了 Map 进行属性的存储的。
(3)、BeanMetadataAttributeAccessor: 代表了一个 Bean 元数据的属性操作。
(4)、BeanMetadataElement: BeanDefinition 元数据,返回该 Bean 的来源。
(5)、BeanDefinition: 用来描述 Bean,里面存放 Bean 元数据,比如 Bean 类名、scope、属性、构造函数参数列表、依赖的 Bean、是否是单例类、是否是懒加载等一些列信息。
(6)、AbstractBeanDefinition: 抽象类统一实现了 BeanDefinition 定义的一部分操作,可以说是定义了 BeanDefinition 很多默认的属性。
(7)、RootBeanDefinition: 代表一个 XML,Java Config来的 BeanDefinition。
(8)、AnnotatedBeanDefinition: 表示注解类型 BeanDefinition。有两个重要的属性:AnnotationMetadata、MethodMetadata 分别表示 BeanDefinition 的注解元信息和方法元信息。实现了此接口的 BeanDefinition 可以获取到注解元数据和方法元数据。
(9)、ChildBeanDefinition: 可以让子 BeanDefinition 定义拥有从父母那里继承配置的能力。
(10)、GenericBeanDefinition: 是 Spring 2.5 之后才有的,这个的想法是用来替代 RootBeanDefinition/ChildBeanDefinition,而 RootBeanDefinition/ChildBeanDefinition 可以在 Spring 预加载的时候使用。
(11)、AnnotatedGenericBeanDefinition: 表示 @Configuration 注解注释的 BeanDefinition 类。是 AnnotatedBeanDefinition 的一个具体实现。传入指定类后,可以获取类中的注解。
(12)、ScannedGenericBeanDefinition: 表示 @Component、@Service、@Controller 等注解注释的 Bean 类。是 AnnotatedBeanDefinition 的另一个实现,与 AnnotatedGenericBeanDefinition 不同的是,ScannedGenericBeanDefinition 是通过扫描 class,然后操作 ASM 进行解析的。
总结
本篇简单介绍了spring bean的相关概念,以及初步分析了BeanDefinition的设计,理论概念性的内容总是枯燥乏味的,为了不影响文章的可读性本篇先介绍到这里,后续再出文章进行补充讲解。
相关文章:

【十二】图解 Spring 核心数据结构:BeanDefinition
图解 Spring 核心数据结构:BeanDefinition 简介 使用spring框架的技术人员都知道spring两个大核心技术IOC和AOP,随着投入更多的时间去学习spring生态,越发觉得spring的发展不可思议,一直都是引领着Java EE的技术变革,这…...
速盾:阿里云ddos黑洞是怎么回事?
阿里云ddos黑洞是一种防御分布式拒绝服务(DDoS)攻击的安全机制。DDoS攻击是指利用大量的合法请求占用目标服务器的资源,从而使服务器无法正常响应合法用户的请求。为了应对这种攻击,阿里云引入了黑洞机制。 黑洞机制是一种主动防…...

File文件转Blob文件,临时路径浏览器可查看
fileToBlob (file) { var reader new FileReader(); reader.readAsArrayBuffer(file); reader.onload function (event) { let blob new Blob([event.target.result], { type: file.type }); //{ type: file.type } 预览blob发现乱码可能是type不对 要获取file文件的type …...
区块链行业DDOS防护痛点在哪
区块链行业DDOS防护痛点在哪?随着区块链技术的迅猛发展,其应用场景已经从最初的数字货币扩展到了金融、供应链、物联网等多个领域。然而,随着区块链行业的快速崛起,其所面临的网络安全威胁也日益严重,尤其是DDoS(分布…...

浏览器自带的IndexDB的简单使用示例--小型学生管理系统
浏览器自带的IndexDB的简单使用示例--小型学生管理系统 文章说明代码效果展示 文章说明 本文主要为了简单学习IndexDB数据库的使用,写了一个简单的增删改查功能 代码 App.vue(界面的源码) <template><div style"padding: 30px&…...

2024年计算机专业还值得选吗?
个人认为可以 一、就业前景广阔 市场需求旺盛:随着数字化和信息化的快速发展,计算机技术已经渗透到各个行业和领域。无论是传统制造业、金融、医疗,还是新兴的互联网、人工智能等领域,都离不开计算机专业人才的支持。因此&#x…...

JSON.parse(JSON.stringify())导致的响应式属性丢失
console.log("formdata赋值前", this.formdata);console.log("row",row);console.log("row序列化后", JSON.parse(JSON.stringify(row)));this.formdata JSON.parse(JSON.stringify(row)); console.log("formdata赋值后", this.formd…...

SpringBoot引入外部依赖包
将需要引入的文件放置到与src同级别的目录下 如上,在src的同级,新建了一个lib目录,将jar包放置其中 在POM文件下,加入如下配置 <dependency><groupId>com.aliyun</groupId><artifactId>com.aliyun.filed…...

Spring事务介绍、Spring集成MyBatis
目录 1.Spring的事务1.1 什么是事务?1.2 事务的特性(ACID)1.3 Spring 事务实现方式有哪些?1.4 Spring事务管理接口介绍1.4.1 PlatformTransactionManager:事务管理接口1.4.2 TransactionDefinition:事务属性事务管理器接口1.4.3 T…...

使用GPG来解密和加密文件详解
文章目录 使用私钥解密文件示例步骤 注意事项加密文件前提条件导入公钥加密文件输出加密文件示例步骤注意事项邮箱不是必须的情况1:有多个公钥情况2:只有一个公钥示例步骤示例1:指定公钥ID或邮箱地址示例2:密钥环中只有一个相关的…...
【Flutter】基础教程:从安装到发布
Flutter 是一种流行的开源移动应用开发框架,由 Google 开发,可用于构建高性能、跨平台的移动应用。本教程将带领你从安装 Flutter 开发环境开始,一步步完成第一个程序,并介绍如何将应用发布到各个平台上。 跨端原理的关键点包括&a…...

51单片机学习记录———定时器
文章目录 前言一、定时器介绍二、STC89C52定时器资源三、定时器框图四、定时器模式五、定时器相关寄存器六、定时器练习 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出~ 提示:以下是本篇文章正文内容,下面案例可供参考 一、定时器介绍 定时器介…...
C# 热插拔---插件开发
热插拔是以多态,文件监控,反射为基础的。所以用到的是FileSystemWatcher类和 Assembly 类,主要原理就是动态加载dll文件,而要监控dll文件,最好的就是用FileSystemWatcher类,它可以实时监控指定路径下的文件…...

hive优化之逻辑类似or逻辑重复
今天拿到一个二次开发的需求,只是增加一个业务类型,开发起来倒是也蛮轻松。 但是,对自己的要求不难这么低,否则可替代性也太高了。 除了完成自己的那部分开发,当然展现自己实力的,可以是优化。 1&#x…...

ES6+Vue
ES6Vue ES6语法 VUE基于是ES6的,所以在使用Vue之前我们需要先了解一下ES6的语法。 1.什么是ECMAScript6 ECMAScript是浏览器脚本语言的规范,基于javascript来制定的。为什么会出现这个规范呢? 1.1.JS发展史 1995年,网景工…...

如何将重量传感器 HX711 与 Arduino 一起使用
How to use a Weight Sensor / Load Cell HX711 with an Arduino 原文 OVERVIEW We’ve all used a scale to determine the weight of something at some point in our lives. Using a Load Cell or Weight sensor you can add this capability to your Arduino projects.…...

HarmonyOS Next开发学习手册——应用启动框架AppStartup
概述 AppStartup提供了一种简单高效的初始化组件的方式,开发者可以使用AppStartup来显示的设置组件的初始化顺序以及之间的依赖关系,支持异步初始化组件加速应用的启动时间。开发者需要分别为待初始化的组件实现AppStartup提供的 StartupTask 接口&…...
如何在Springboot中添加事务执行?(以MySQL为例)
目录 1. 添加依赖 2. 配置数据库连接 3. 启用事务管理 4. 创建实体类和存储库 5. 创建服务类并使用Transactional注解 6. 编写测试用例 7. 运行应用程序 在Springboot中开启数据库的事务的应用开发过程中非常重要的业务,以下是一个使用MySQL数据库࿰…...
优化MySQL并发事务:如何避免更新丢失问题?
背景描述 现在有两个事务,事务A和事务B,他们都需要修改同一行数据,这行数据原始值为100,事务A的操作是数据增加100,事务B的操作也是增加100,预期的最终结果是300,现在如何保证最终的数据是300的…...
物联网设备管理系统设计
一、引言 物联网设备管理系统设计旨在通过物联网技术实现对设备的全面监控、控制和管理,以提高设备的运行效率、降低运维成本,并确保数据的安全性和完整性。本设计将结合当前物联网技术的发展趋势和实际应用需求,提出一个清晰、可扩展的物联网…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...

day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...
【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统
Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...