Spring如何实现组件扫描与@Component注解原理

article/2025/8/12 17:07:24

Spring如何实现组件扫描与@Component注解原理

  • 注解配置与包扫描的实现机制
    • 一、概述:什么是注解配置与包扫描?
    • 二、处理流程概览
    • 三、注解定义
      • @Component
      • @Scope
    • 四、核心代码结构
      • 1. `ClassPathScanningCandidateComponentProvider`
      • 2. `ClassPathBeanDefinitionScanner`

源码见:mini-spring

在这里插入图片描述

注解配置与包扫描的实现机制

一、概述:什么是注解配置与包扫描?

在基于注解的 Spring 样式容器中,包扫描(Package Scanning)与注解配置(Annotation Configuration) 是核心的自动化注册机制:

本质上,它通过扫描指定包路径下的类,识别其中包含特定注解(如 @Component, @Scope),并将其自动注册为容器中的 Bean。


二、处理流程概览

要实现注解注册 Bean 的机制,大致流程如下:

  1. 确定扫描路径:通常由配置文件(如 XML)提供;

  2. 扫描类文件:获取指定包路径下所有类;

  3. 筛选目标类:识别包含目标注解的类,如 @Component

  4. 构建 BeanDefinition:为每个匹配类生成对应的 BeanDefinition;

  5. 注册 BeanDefinition:将生成的 BeanDefinition 注册到 BeanDefinitionMap 中。

此流程应发生在 BeanDefinition 的加载阶段,因此其集成逻辑最终应写入 XmlBeanDefinitionReader 中。我们可以将功能模块解耦为:

  • 扫描器模块:负责扫描、识别和构建 BeanDefinition;

  • 注册器集成:负责注册这些 BeanDefinition。


三、注解定义

@Component

用于标记一个类为容器可管理的组件:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Component {String value() default "";
}

@Scope

用于定义组件的作用域(如 singleton / prototype):

@Documented
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Scope {String value() default "singleton";
}

四、核心代码结构

1. ClassPathScanningCandidateComponentProvider

用于扫描指定包路径下所有带 @Component 注解的类,并构建对应的 BeanDefinition:

public class ClassPathScanningCandidateComponentProvider {public Set<BeanDefinition> findCandidateComponents(String basePackage) {Set<BeanDefinition> candidates = new LinkedHashSet<>();Set<Class<?>> classes = ClassUtil.scanPackageByAnnotation(basePackage, Component.class);for (Class<?> clazz : classes) {candidates.add(new BeanDefinition(clazz));}return candidates;}
}

2. ClassPathBeanDefinitionScanner

继承扫描器,实现更完整的处理逻辑:

  • 解析作用域(@Scope);

  • 解析 Bean 名称(默认类名首字母小写);

  • 完成 BeanDefinition 的注册。

public class ClassPathBeanDefinitionScanner extends ClassPathScanningCandidateComponentProvider {private final BeanDefinitionRegister register;public ClassPathBeanDefinitionScanner(BeanDefinitionRegister register) {this.register = register;}public void doScan(String... basePackages) {for (String basePackage : basePackages) {Set<BeanDefinition> candidates = super.findCandidateComponents(basePackage);for (BeanDefinition candidate : candidates) {// 设置作用域String scope = resolveBeanScope(candidate);if (StrUtil.isNotEmpty(scope)) {candidate.setScope(scope);}// 设置 Bean 名称并注册String beanName = determineBeanName(candidate);register.registerBeanDefinition(beanName, candidate);}}}private String determineBeanName(BeanDefinition definition) {Class<?> clazz = definition.getBeanClass();Component component = clazz.getAnnotation(Component.class);String value = component.value();return StrUtil.isEmpty(value) ? StrUtil.lowerFirst(clazz.getSimpleName()) : value;}private String resolveBeanScope(BeanDefinition definition) {Scope scope = definition.getBeanClass().getAnnotation(Scope.class);return scope != null ? scope.value() : StrUtil.EMPTY;}
}

http://www.hkcw.cn/article/SopMTCPCPJ.shtml

相关文章

NLP学习路线图(十六):N-gram模型

一、为何需要语言模型&#xff1f;概率视角下的语言本质 自然语言处理的核心挑战在于让机器“理解”人类语言。这种理解的一个关键方面是处理语言的歧义性、创造性和结构性。语言模型&#xff08;Language Model, LM&#xff09;为此提供了一种强大的数学框架&#xff1a;它赋…

使用ReactNative加载HarmonyOS Svga动画

这是一款使用ReactNative 加载HarmonyOS Svga动画的播放器插件 三端Svga动画统一使用点击这里 版本:v1.1.2 react-native-ohos-svgaplayer [!TIP] Github 地址 安装与使用 npm npm install react-native-ohos-svgaplayer yarn yarn add react-native-ohos-svgaplayer下面…

电路图识图基础知识-高、低压供配电系统一次系统识图(十一)

1、高、低压供配电 一 次系统的介绍 供配电系统中输送、分配和使用电能的电路&#xff0c;称为一次电路或一次回路&#xff0c;也称为一次系统或主接线。控制、指示、测量和保护一次电路及其中设备运行的电路&#xff0c;称为二次电路或二次回路.也称为二次系统。 工厂供配电系…

read-bridge开源程序是AI 增强阅读工具,使用 n+1 方法进行沉浸式语言学习。通过留在目标语言生态系统中学习语言,具有以流状态为中心的界面。

​一、软件介绍 文末提供程序和源码下载 read-bridge开源程序是AI 增强阅读工具&#xff0c;使用 n1 方法进行沉浸式语言学习。通过留在目标语言生态系统中学习语言&#xff0c;具有以流状态为中心的界面。 二、Overview 概述 此阅读助手支持源到源语言学习方法&#xff0c;减…

调教 DeepSeek - 输出精致的 HTML MARKDOWN

【序言】 不知道是不是我闲的蛋疼&#xff0c;对百度AI 和 DeepSeek 的回答都不太满意。 DeepSeek 回答句子的引用链接&#xff0c;始终无法准确定位。有时链接只是一个域名&#xff0c;有时它给的链接是搜索串如: baidu.com/?q"搜索内容"。 百度AI 回答句子的引用…

【论文阅读 | PR 2024 |ICAFusion:迭代交叉注意力引导的多光谱目标检测特征融合】

论文阅读 | PR 2024 |ICAFusion&#xff1a;迭代交叉注意力引导的多光谱目标检测特征融合 1.摘要&&引言2.方法2.1 架构2.2 双模态特征融合&#xff08;DMFF&#xff09;2.2.1 跨模态特征增强&#xff08;CFE&#xff09;2.2.2 空间特征压缩&#xff08;SFS&#xff09;…

本振相参解析(1)2025.6.1

前言 本振相参是射频与通信系统中的关键技术概念&#xff0c;涉及本机振荡器&#xff08;LO&#xff09;信号的相位稳定性和多信号间的相干性控制。以下从定义、关键技术、应用场景及挑战等方面展开分析&#xff1a; 一、核心概念解析 本振&#xff08;Local Oscillator, LO…

一个完整的日志收集方案:Elasticsearch + Logstash + Kibana+Filebeat (一)

整体链路 [应用服务器] --> [Filebeat] --> [Logstash] --> [Elasticsearch] --> [Kibana] 组件职责 Kibana&#xff1a; 可视化和分析日志数据Elasticsearch&#xff1a; 存储和索引日志数据Logstash&#xff1a; 解析、转换和丰富日志数据Filebeat&#xff1a…

Notepad++找回自动暂存的文件

场景&#xff1a; 当你没有保存就退出Notepad&#xff0c;下次进来Notepad会自动把你上次编辑的内容显示出来&#xff0c;以便你继续编辑。除非你手动关掉当前页面&#xff0c;这样Notepad就会删除掉自动保存的内容。 问题&#xff1a; Notepad会将自动保存的文件地址,打开Note…

VMware-VMRC-12.0.1-18113358安装包下载安装与使用(附下载)

文章目录 简介1、下载地址2、安装使用总结 简介 VMware-VMRC&#xff08;VMware Virtual Machine Remote Console&#xff09; 是 VMware 提供的一款远程控制台工具&#xff0c;用于连接和管理 VMware 虚拟化环境中的虚拟机&#xff08;VM&#xff09;。它允许用户通过图形界面…

车载诊断框架 ---CAN诊断多帧传输时间参数记忆口诀

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

docker、ctr、crictl命令简介与使用

概述 在使用k3s过程中&#xff0c;经常需要使用ctr和crictl两个命令&#xff0c;本文记录一下。 ctr 类似docker命令是docker-shim容器运行时的客户端工具&#xff0c;ctr是Containerd的客户端工具。一个简单的CLI接口&#xff0c;用作Containerd本身的一些调试用途&#xf…

Docker安装mitproxy

一&#xff1a;概述 mitmproxy 是一组工具&#xff0c;可为 HTTP/1、HTTP/2 和 WebSockets 提供支持 SSL/TLS 的交互式拦截代理。 二&#xff1a;安装 2.1 运行并拉取镜像 ocker run --rm -it -p 8080:8080 -p 0.0.0.0:8081:8081 mitmproxy/mitmproxy mitmweb --web-host 0.0…

Linux 简单模拟实现C语言文件流

&#x1f307;前言 在 C语言 的文件流中&#xff0c;存在一个 FILE 结构体类型&#xff0c;其中包含了文件的诸多读写信息以及重要的文件描述符 fd&#xff0c;在此类型之上&#xff0c;诞生了 C语言 文件相关操作&#xff0c;如 fopen、fclose、fwrite 等&#xff0c;这些函数…

数据要素×AI:高质量数据集如何成为智能时代的“新石油“

在数字中国建设峰会上&#xff0c;国家数据局提出的"三类高质量数据集"建设规划引发广泛关注。这不仅是技术层面的创新&#xff0c;更是对数据要素价值释放路径的深刻思考。当我们站在AI产业化的关键节点回望&#xff0c;会发现数据正在经历一场从"原料"到…

CCPC dongbei 2025 I

题目链接&#xff1a;https://codeforces.com/gym/105924 题目背景&#xff1a; 给定一个二分图&#xff0c;左图编号 1 ~ n&#xff0c;右图 n 1 ~ 2n&#xff0c;左图的每个城市都会与右图的某个城市犯冲&#xff08;每个城市都只与一个城市犯冲&#xff09;&#xff0c;除…

如何学习开关电源?从“大”到“小”学习开关电源...

01 / 简介 / 参考 开关电源研学群[BUCK] ,之前创建了开关电源研学群,为电源同行提供学习交流的平台。参考 一种高效的硬件工程师学习方法[更新篇,更牛逼,加量不加价] ,之前也给大家推荐了更加高效的学习方法。 群内有很多电源大佬,经常给大家解答疑问,在此表示感谢;…

C#里与嵌入式系统W5500网络通讯(3)

有与W5500通讯时,需要使用下面的寄存器: PHYCFGR (W5500 PHY Configuration Register) [R/W] [0x002E] [0b10111XXX] PHYCFGR configures PHY operation mode and resets PHY. In addition, PHYCFGR indicates the status of PHY such as duplex, Speed, Link. 这张表格详细…

WEB3——开发者怎么查看自己的合约日志记录

在区块链中查看合约的日志信息&#xff08;也叫事件 logs&#xff09;&#xff0c;主要有以下几种方式&#xff0c;具体方法依赖于你使用的区块链平台&#xff08;如 Ethereum、BSC、Polygon 等&#xff09;和工具&#xff08;如 Etherscan、web3.js、ethers.js、Hardhat 等&am…

【深度学习】17. 深度生成模型:DCGAN与Wasserstein GAN公式深度推导

深度生成模型:DCGAN与Wasserstein GAN公式深度推导 深度卷积生成对抗网络 DCGAN 在原始 GAN 框架中&#xff0c;生成器和判别器通常使用全连接层构建&#xff0c;这限制了模型处理图像的能力。为此&#xff0c;Radford 等人在 2016 年提出了 DCGAN&#xff08;Deep Convoluti…