【十二】图解 Spring 核心数据结构:BeanDefinition

news2024/7/31 12:46:07

图解 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的设计,理论概念性的内容总是枯燥乏味的,为了不影响文章的可读性本篇先介绍到这里,后续再出文章进行补充讲解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1858717.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL之可扩展性(一)

可扩展性 概述 有些应用仅仅适用于一台或少数几台服务器,那么哪些可扩展性建议是和这些应用相关的呢?大多数人从不会维护超大规模的系统,并且通常也无法效仿在主流大公司所使用的策略。选择一个合适的策略能够大大地节约时间和金钱。 MySQL…

ONLYOFFICE 桌面编辑器8.1---一个高效且强大的办公软件

软件介绍 ONLYOFFICE 桌面编辑器经过不断的更新换代现在迎来了,功能更加强大的ONLYOFFICE 桌面编辑器8.1是一个功能强大的办公套件,专为多平台设计,包括Windows、Linux和macOS。它提供了一套全面的办公工具,包括文档处理、电子表…

IO-Iink事件

IO-LINK事件功能 IO-Link的事件功能是其通信协议中的一项重要特性,主要用于传输设备的故障信息和维护信息。IO-Link支持三种数据类型:过程数据、参数数据和事件数据。其中,事件数据就是用于此目的。 当IO-Link设备(如传感器或执…

大咖共话|智领未来,数字化革新生命健康产业

在数字化浪潮席卷全球的今天,生命健康产业正迎来前所未有的发展机遇。6月20日,“第三届滨海中关村协同创新发展交流会”在北京隆重举办,唯迈医疗与业界大咖齐聚一堂,在“数字化赋能驱动生命健康产业发展”圆桌论坛上,共…

记一下 Stream 流操作

Java Stream流 创建流 Collection.stream() / Collection.parallelStream()&#xff1a;从集合生成流&#xff0c;后者为并行流。 List<String> list new ArrayList<>(); Stream<String> stream list.stream(); //获取一个顺序流 Stream<String> …

《C++ Primer》导学系列:第 8 章 - IO库

8.1 IO类 C标准库提供了一套丰富的输入输出&#xff08;IO&#xff09;类&#xff0c;用于处理数据的输入输出操作。这些类位于<iostream>头文件中&#xff0c;包括处理标准输入输出的istream和ostream类&#xff0c;处理文件输入输出的ifstream和ofstream类&#xff0c…

Java 8 Date and Time API

Java 8引入了新的日期和时间API&#xff0c;位于java.time包下&#xff0c;旨在替代旧的java.util.Date和java.util.Calendar类。新API更为简洁&#xff0c;易于使用&#xff0c;并且与Joda-Time库的一些理念相吻合。以下是Java 8 Date and Time API中几个核心类的简要概述&…

构建开源多模态RAG系统

在这个新的冒险中&#xff0c;我们将深入研究使用开源大型语言多模态&#xff08;LLMM&#xff09;构建检索增强型生成&#xff08;RAG&#xff09;系统的过程。值得注意的是&#xff0c;我们的重点是在不依赖LangChain或Llama索引的情况下实现这一点&#xff1b;相反&#xff…

Trilium windows上修改笔记目录,创建多个笔记空间方法

一开始使用trilium会非常的不舒服&#xff0c;不像是obsidian可以创建多个笔记空间&#xff0c;指定多个笔记目录。这里摸索到了解决方案 修改目录的方法一 ——修改系统环境变量 打开控制面板-系统-高级系统设置 新增如上条目 修改目录的方法二——直接写bat脚本运行 新建位…

Scope XY Project的使用

1.Scope XY Project的功能介绍与使用方法 添加监控变量 绘制成一个三角形 XY进行对调操作 修改XY轴的比例修改显示输出 2.Cursor的使用方法 游标线的添加测量 3.Reporting功能的使用方法 到处对应的报表数据 添加对应的报告数据

React Suspense的原理

React Suspense组件的作用是当组件未完成加载时&#xff0c;显示 fallback 组件。那么 Suspense 是如何实现的呢&#xff1f;React 的渲染是通过 Fiber 进行的&#xff0c;Suspense 的更新机制也是要围绕 Fiber 架构进行的。Suspense 是由两部分组成&#xff0c;实际 UI 子组件…

Go 语言学习笔记之字典 Map

Go 语言中的字典 Map 大家好&#xff0c;我是码农先森。 概念 在 Go 语言中&#xff0c;字典被称为 map&#xff0c;它是一种无序的集合&#xff0c;用于存储键值对。每个键在 map 中必须是唯一的&#xff0c;并且对应一个值。map 是一种非常常用的数据结构&#xff0c;用于…

iptables(6)扩展匹配条件--tcp-flags、icmp

简介 前面我们已经介绍了不少的扩展模块,例如multiport、iprange、string、time、connlimit模块,但是在tcp扩展模块中只介绍了tcp扩展模块中的”--sport”与--dport”选项,并没有介绍”--tcp-flags”选项,那么这篇文章,我们就来认识一下tcp扩展模块中的”--tcp-flags”和i…

毫米波移动通信系统中的波束赋形— 基于码本的波束训练

基于码本的波束训练算法该方法在收发端都配置波束矢量的码本&#xff0c;通过波束搜索的方式发现最优的波束方向为了加快波束搜索的速度&#xff0c;往往采用逐步缩小搜索范围的方式加快搜索&#xff0c;可以将搜索算法的时间复杂度从O(N)降低到O(logN)&#xff0c;其中N表示码…

spring-gateway include-expression 配置说明

在开发过程中遇到的一些配置问题&#xff0c;记录下来以供参考 spring-gateway版本是2.2.9-release,使用的spring cloud dependence 是 Hoxton.SR12 在依赖eureka 服务发现并自动将发现服务器加入到router中的时候&#xff0c;需要指定对应的服务进行添加&#xff0c;根据文档…

NtripShare2024年第二季度主要技术进展

NtripShare Cloud GNSS解算云平台方面 1、解算引擎增加根据卫星多路径效应自动剔除卫星的算法。 2、解算引擎增加解算时间段限制&#xff08;发现贵州某地在晚12点周期性效果变差&#xff09;。 3、增加2000坐标至地方坐标系转换的支持(七参数、四参数、TGO高程拟合&#x…

GitHub星标破千!斯坦福大学的284个机器学习小抄(漫画中文版)

说到人工智能必然要了解机器学习&#xff0c;从信息化软件&#xff0c;到电子商务&#xff0c;然后到高速发展互联网时代&#xff0c;到至今的云计算、大数据等&#xff0c;渗透到我们的生活、工作之中&#xff0c;在互联网的驱动下&#xff0c;人们更清晰的认识和使用数据&…

第一百二十三节 Java面向对象的设计 - Java接口继承

Java面向对象的设计 - Java接口继承 接口可以从另一个接口继承。与类不同&#xff0c;接口可以从多个接口继承。 interface Singer {void sing();void setRate(double rate);double getRate(); } interface Writer {void write();void setRate(double rate);double getRate();…

【代码随想录刷题】day02——977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

977.有序数组的平方 方法一&#xff1a;暴力法 class Solution { public:vector<int> sortedSquares(vector<int>& nums) {// 暴力法for(int i 0; i < nums.size(); i){nums[i] * nums[i];}sort(nums.begin(), nums.end());return nums;} };方法二&#…

思考题:相交的几何图形

给定不超过 26 个几何图形&#xff0c;每个图形都有一个唯一大写字母作为其编号。 每个图形在平面中的具体位置已知&#xff0c;请你判断&#xff0c;对于每个图形&#xff0c;有多少个其他图形与其存在交点。 在判断交点时&#xff0c;只考虑边与边相交的情况&#xff0c;如…