Spring自动装配的底层逻辑

news/2024/4/20 4:42:45/文章来源:https://blog.csdn.net/qq_16546235/article/details/129160970

Spring是如何自动装配Bean的?看源码+一些自己的理解,如有错漏,请指正

使用Spring之前我们要先去web.xml中设置一下Spring的配置文件,在Spring的配置文件中,是通过component-scan扫描器去扫描base-package底下所有的类装配到容器中。

<context:component-scan base-package="xxx"/>

要怎么看component-scan的处理类呢?这要看在这个配置文件顶部配置的context命名空间。

xmlns:context="http://www.springframework.org/schema/context"

然后根据这个命名空间去context对应的jar包中找到spring.handlers,在这个文件中就可以找到
在这里插入图片描述
点进去后就可以看到对应的处理类
在这里插入图片描述
再点进来,就可以看到最主要的方法:parse(Element element, ParserContext parserContext)

public BeanDefinition parse(Element element, ParserContext parserContext) {StringbasePackage = element.getAttribute("base-package");basePackage = parserContext.getReaderContext().getEnvironment().resolvePlaceholders(basePackage);String[] basePackages = StringUtils.tokenizeToStringArray(basePackage, ",; \t\n");//配置扫描器ClassPathBeanDefinitionScanner scanner = this.configureScanner(parserContext, element);//扫描basePackages,将BeanDefinition装配到容器中Set<BeanDefinitionHolder> beanDefinitions = scanner.doScan(basePackages);this.registerComponents(parserContext.getReaderContext(), beanDefinitions, element);//将组成部分进行注册(这边没什么用处,只是用于扩展)return null;
}

先来看看doScan方法

protected Set<BeanDefinitionHolder> doScan(String... basePackages) {Assert.notEmpty(basePackages, "At least one base package must be specified");Set<BeanDefinitionHolder> beanDefinitions = new LinkedHashSet();String[] var3 = basePackages;int var4 = basePackages.length;for(int var5 = 0; var5 < var4; ++var5) {String basePackage = var3[var5];Set<BeanDefinition> candidates = this.findCandidateComponents(basePackage);Iterator var8 = candidates.iterator();while(var8.hasNext()) {BeanDefinition candidate = (BeanDefinition)var8.next();ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(candidate);//candidate.setScope(scopeMetadata.getScopeName());String beanName = this.beanNameGenerator.generateBeanName(candidate, this.registry);if (candidate instanceof AbstractBeanDefinition) {this.postProcessBeanDefinition((AbstractBeanDefinition)candidate, beanName);}if (candidate instanceof AnnotatedBeanDefinition) {AnnotationConfigUtils.processCommonDefinitionAnnotations((AnnotatedBeanDefinition)candidate);}if (this.checkCandidate(beanName, candidate)) {BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(candidate, beanName);definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);beanDefinitions.add(definitionHolder);this.registerBeanDefinition(definitionHolder, this.registry);}}}return beanDefinitions;}

这个方法中最重要的就是this.registerBeanDefinition(definitionHolder, this.registry)这句代码,跟着代码走到最后,发现最终是将对应的beanDefinition放到了ConcurrentHashMap中,实现了Bean的装配。

this.beanDefinitionMap.put(beanName, beanDefinition);

这自动装配的逻辑过得有点快,不管了,先这样。

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

google hacker语句

哎&#xff0c;我就是沾边&#xff0c;就是不打实战(&#xffe3;o&#xffe3;) . z Z 文章目录前言一、什么是谷歌Docker&#xff1f;二、受欢迎的谷歌docker语句谷歌docker的例子日志文件易受攻击的 Web 服务器打开 FTP 服务器SSH私钥电子邮件列表实时摄像机MP3、电影和 PDF…

Rocky 9.1操作系统实现zabbix6.0的安装部署实战

文章目录前言一. 实验环境二. 安装zabbix过程2.1. 安装zabbix源2.2 安装zabbix相关的软件2.3 安装数据库并启动2.4 开始初始化数据库&#xff1a;2.5 创建数据库实例及对应的用户2.6 导入官网提供的数据2.7 配置zabbix 服务的配置文件2.8. 启动服务2.9 从网页进行安装2.10 登陆…

从0开始学python -37

Python3 错误和异常 作为 Python 初学者&#xff0c;在刚学习 Python 编程时&#xff0c;经常会看到一些报错信息&#xff0c;在前面我们没有提及&#xff0c;这章节我们会专门介绍。 Python 有两种错误很容易辨认&#xff1a;语法错误和异常。 Python assert&#xff08;断…

单元测试面试秘籍分享

1. 什么是单元测试 “在计算机编程中&#xff0c;单元测试又称为模块测试&#xff0c;是针对程序模块来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中&#xff0c;一个单元就是单个程序、函数、过程等&#xff1b;对于面向对象编程&#xff0c;最…

代码随想录NO49 | 动态规划 _LeetCode1143.最长公共子序列 1035.不相交的线 53. 最大子序和

动态规划 _LeetCode1143.最长公共子序列 1035.不相交的线 53. 最大子序和今天继续子序列问题&#xff01; 1143.最长公共子序列 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符…

从功能测试(点点点)到进阶自动化测试,实现薪资翻倍我只用了3个月时间

前言 从事测试工作已3年有余了&#xff0c;今天想聊一下自己刚入门时和现在的今昔对比&#xff0c;虽然现在也没什么成就&#xff0c;只能说笑谈一下自己的测试生涯&#xff0c;各位看官就当是茶余饭后的吐槽吧&#xff0c;另外也想写一写自己的职场感想&#xff0c;希望对刚开…

如何使用 ESP-PROG 板的 Program 接口为 ESP32-S3-WROOM-1 系列的模组烧录固件?

ESP-PROG 是一款乐鑫推出的开发调试工具&#xff0c;具有自动下载固件、串口通信、JTAG 在线调试等功能。具体使用说明参见&#xff1a;ESP-Prog 下载与调试板介绍 。 ESP-Prog 采用 FTDI 公司的 FT2232HL 为 USB Bridge Controller 芯片&#xff0c;可通过配置将 USB 2.0 接口…

分布式链路追踪-skywalking

一、分布式调用链随着业务的高速发展&#xff0c;服务之间的调用关系愈加复杂线上每一个请求会经过多个业务系统&#xff0c;并产生对各种缓存或者DB 的访问&#xff0c;业务流会经过很多个微服务的处理和传递。问题&#xff1a;• —次请求的流量从哪个服务而来&#xff1f;最…

在CentOS-7.9配置vsftpd服务

文章目录一 vsftpd简介二 环境准备三 服务部署3.1 安装软件3.2 编写配置文件3.3 用户授权3.4 启动服务3.5 文件传输测试3.5.1 Windows到Linux3.5.2 filezilla3.5.3 从Linux到Linux一 vsftpd简介 FTP是 File Transfer Protocol 文件传输协议的简称。 VSFTP是 Very Security FTP…

ESP32-C3 BLE5.0 扩展蓝牙名称长度的流程

蓝牙设备名称长度受限于蓝牙广播数据包的长度&#xff0c;如果广播数据包的长度不能包含完整的设备名称&#xff0c;则只显示短名称&#xff0c;其余不能容纳的部分将被截断。ESP32-C3 支持 BLE5.0&#xff0c;最大广播包长支持 1650 字节&#xff0c;可通过 esp_ble_gap_confi…

PTA L1-054 福到了(详解)

前言&#xff1a;内容包括&#xff1a;题目&#xff0c;代码实现&#xff0c;大致思路&#xff0c;代码解读 题目&#xff1a; “福”字倒着贴&#xff0c;寓意“福到”。不论到底算不算民俗&#xff0c;本题且请你编写程序&#xff0c;把各种汉字倒过来输出。这里要处理的每…

【python】argparse 模块的使用、Pycharm中使用argparse

目录1、简介2、使用步骤1&#xff09;导入argparse模块&#xff0c;并创建解释器2&#xff09;添加所需参数3&#xff09;解析参数3、使用 pycharm 传递参数给 argparse1、简介 argparse 模块是 Python 标准库中提供的一个命令行解析模块&#xff0c;它可以让使用者以类似 Uni…

编程题(二)

一、N皇后 II n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回 n 皇后问题 不同的解决方案的数量。 示例 1&#xff1a; 输入&#xff1a;n 4 输出&#xff1a;2 解释&#xff1a;如…

C#使用MQTT通信 .Net实现MQTT通信 java使用MQTT通信 java实现MQTT通信

MQTT是一种轻量级、基于发布/订阅模式的通信协议&#xff0c;通常用于物联网设备间的通信。MQTT协议采用简单的二进制消息格式&#xff0c;能够在不占用过多网络带宽的情况下进行高效的通信。以下是使用MQTT进行通信的一些基本概念&#xff1a;BrokerMQTT通信中的中间件&#x…

一文速学数模-集成预测模型Boost(提升方法)原理以及框架+模型速览

目录 前言 一、Boosting算法起源 强学习 弱学习 二、Boosting算法核心思想 举例案例 类推 三、Boosting算法框架 四、Boosting算法种类 AdaBoost GBDT XGBoost LighGBM 1.数据划分 2.直方图梯度提升决策树&#xff08;Histogram-based Gradient Boosting Decisio…

一、线程的基本概念

文章目录基础概念线程与进程什么是进程&#xff1f;什么是线程&#xff1f;进程和线程的区别&#xff1a;多线程什么是多线程&#xff1f;多线程的局限性串行、并行、并发同步异步、阻塞非阻塞线程的创建1、继承Thread类&#xff0c;重写run方法2、实现Runnable接口&#xff0c…

软件质量测试中的健壮性测试是什么?一文和你说

当大多数人开车时&#xff0c;他们不会担心刹车失灵。当他们的孩子得到一个新玩具时&#xff0c;他们也不担心因故障受伤。事实上&#xff0c;大多数人在日常生活中根本不担心系统故障。 这是因为软件开发人员或质量控制工程师已经解决了质量问题。如果目标是交付高质量、可靠…

Win11安装软件报缺失.NET的解决方法

1.问题描述&#xff1a;安装软件时提示这个 2.解决方法&#xff1a; WinR 打开运行界面&#xff0c;输入control回车&#xff0c;打开控制面板 点击打开程序和功能 选择 启用或关闭Windows功能 --》勾选.NET Framework3.5...这一项&#xff0c;点击确定&#xff0c;如果电脑上…

学习Flask之五、数据库

学习Flask之五、数据库 数据库有组织的存贮应用数据。根据需要应用发布查询追踪特定部分。网络应用最常用的数据库是基于关系模式的&#xff0c;也称为SQL数据库&#xff0c;引用结构化查询语句。但是近年来&#xff0c;面向文档和键值的数据库&#xff0c;非正式的统称为NoSQ…

一文教你玩转 Apache Doris 分区分桶新功能|新版本揭秘

数据分片&#xff08;Sharding&#xff09;是分布式数据库分而治之 (Divide And Conquer) 这一设计思想的体现。过去的单机数据库在大数据量下往往面临存储和 IO 的限制&#xff0c;而分布式数据库则通过数据划分的规则&#xff0c;将数据打散分布至不同的机器或节点上&#xf…