Spring源码注解篇三:深入理解@Component注解
@Component及其派生注解的源码
Spring框架作为Java开发中不可或缺的一部分,其依赖注入机制的核心是通过注解来实现的。本文将深入探讨Spring中@Component及其派生注解的源码实现,分析Spring如何通过类路径扫描(Classpath Scanning)和BeanDefinition的封装来管理Bean的生命周期和依赖。
1. 引言
Spring框架的依赖注入机制极大地简化了Java应用的配置和组件管理。通过使用注解,Spring允许开发者以一种声明式的方式定义和管理Bean,从而提高代码的可读性和可维护性。
2. Spring注解概览
Spring提供了多种注解,用于标识类、方法和属性。这些注解可以分为以下几类:
- 类级别注解:如
@Component、@Service、@Repository和@Controller,用于标识类作为Spring容器管理的Bean。 - 方法级别注解:如
@Autowired和@PostConstruct,用于处理Bean的依赖注入和生命周期回调。 - 属性级别注解:如
@Value,用于注入配置属性。
3. @Component注解详解
@Component是Spring中用于标识类为组件的基础注解。它是一个元注解,由以下注解组成:
@Target(ElementType.TYPE):指定注解应用于类。@Retention(RetentionPolicy.RUNTIME):确保注解在运行时可用。@Documented:表示注解应该被包含在JavaDoc中。@Infrastructure:标记为Spring框架的基础设施。
4. 类路径扫描与BeanDefinition的创建
Spring容器通过ClassPathBeanDefinitionScanner进行类路径扫描,以发现带有@Component注解的类。扫描过程包括:
- 初始化扫描器:设置要扫描的包路径。
- 筛选注解类:使用
TypeFilter筛选带有@Component的类。 - 创建BeanDefinition:为每个筛选出的类创建
ScannedGenericBeanDefinition。
4.1 源码分析:ClassPathBeanDefinitionScanner
public int scan(String... basePackages) {// 省略其他代码for (String basePackage : basePackages) {Set<BeanDefinition> beanDefinitions = scanPackage(basePackage);for (BeanDefinitionHolder beanDefinitionHolder : beanDefinitions) {registerBeanDefinition(beanDefinitionHolder);}}return beanDefinitions.size();
}
scanPackage方法使用TypeFilter来筛选类,而registerBeanDefinition方法将BeanDefinition注册到Spring容器。
5. 注解的进一步解析
Spring不仅解析@Component注解,还会解析类中定义的其他注解。这包括字段注解、方法注解和构造函数注解。Spring使用BeanPostProcessor接口来处理这些注解。
5.1 源码分析:AutowiredAnnotationBeanPostProcessor
public class AutowiredAnnotationBeanPostProcessor extends AbstractAutowireCapableBeanFactoryimplements BeanPostProcessor, PriorityOrdered {@Overridepublic PropertyValues postProcessProperties(PropertyValues pvs, BeanDefinition bd,String beanName, BeanFactory beanFactory) {// 处理@Autowired注解return pvs;}
}
postProcessProperties方法在Bean的属性设置之后调用,允许BeanPostProcessor处理特定的注解。
6. @Component派生注解的深入分析
@Controller、@Service和@Repository注解都是@Component的特化,它们继承了@Component的所有属性,并添加了特定于各自领域的语义。
6.1 源码分析:@Controller注解
@Controller
public @interface Controller {String value() default "";
}
@Controller注解不仅标识了一个Spring MVC的控制器,还通过@RequestMapping注解提供了路由信息。
7. Spring容器中的Bean注册
BeanDefinition的注册是通过BeanDefinitionRegistry接口实现的。注册过程包括:
- 调用
registerBeanDefinition:将BeanDefinition与Bean名称关联。 - Bean名称检查:确保Bean名称的唯一性。
7.1 源码分析:BeanDefinitionRegistry
public interface BeanDefinitionRegistry extends AliasRegistry {void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)throws BeanDefinitionStoreException;boolean containsBeanDefinition(String beanName);
}
registerBeanDefinition方法在Spring容器启动时被调用,以注册所有的BeanDefinition。
8. 实践案例
以下是一个使用@Service注解的简单Spring应用示例:
@Service
public class MyService {@Autowiredprivate Dependency dependency;public void performAction() {// 使用dependency执行操作}
}
在这个例子中,MyService类被标记为@Service,Spring容器将自动注入所有标记了@Autowired的依赖项。
9. 小结
本文深入分析了Spring注解的源码实现,特别是@Component及其派生注解。通过类路径扫描和BeanDefinition的封装,Spring提供了一种强大而灵活的方式来管理应用中的Bean。理解这些机制对于构建高效、可维护的Spring应用至关重要。
相关文章:
Spring源码注解篇三:深入理解@Component注解
Component及其派生注解的源码 Spring框架作为Java开发中不可或缺的一部分,其依赖注入机制的核心是通过注解来实现的。本文将深入探讨Spring中Component及其派生注解的源码实现,分析Spring如何通过类路径扫描(Classpath Scanning)和…...
SpringBoot中常用的注解及其用法
1. 常用类注解 RestController和Controller是Spring中用于定义控制器的两个类注解. 1.1 RestController RestController是一个组合类注解,是Controller和ResponseBody两个注解的组合,在使 用 RestController 注解标记的类中,每个方法的返回值都会以 JSON 或 XML…...
【大语言模型】私有化搭建-企业知识库-知识问答系统
下面是我关于大语言模型学习的一点记录 目录 人工智能学习路线 MaxKB 系统(基于大语言模型的知识问答系统) 部署开源大语言模型LLM 1.CPU模式(没有好的GPU,算力和效果较差) 2.GPU模式(需要有NVIDIA显卡支持) Ollama网络配置 Ollama前…...
CSS常用的样式
字体和文本样式 font-family: 定义文本字体。 font-size: 设置字体大小。 color: 设置文本颜色。 text-align: 水平对齐文本(左对齐、右对齐、居中、两端对齐)。 line-height: 设置行间距。 text-decoration: 控制文本装饰线(如下划线、…...
结合实体类型信息(2)——基于本体的知识图谱补全深度学习方法
1 引言 1.1 问题 目前KGC和KGE提案的两个主要缺点是:(1)它们没有利用本体信息;(二)对训练时未见的事实和新鲜事物不能预测的。 1.2 解决方案 一种新的知识图嵌入初始化方法。 1.3 结合的信息 知识库中的实体向量表示+编码后的本体信息——>增强 KGC 2基…...
如何在电脑上演示手机上APP,远程排查移动端app问题
0序: 对接客户,给领导演示移动端产品,或者远程帮用户排查移动端产品的问题。都需要让别人能够看到自己在操作手机。 会议室可以使用投屏,但需要切换电脑和手机。 排查问题经常都是截图、或者手机上录制视频,十分繁琐…...
SQL Server 创建用户并授权
创建用户前需要有一个数据库,创建数据库命令如下: CREATE DATABASE [数据库名称]; CREATE DATABASE database1; 一、创建登录用户 方式1:SQL命令 命令格式:CREATE LOGIN [用户名] WITH PASSWORD 密码; 例如,创建…...
网关设备BL122实现Modbus RTU/TCP转Profinet协议
Modbus与Profinet是两种广泛应用于工业自动化领域的通信协议:Modbus因其简单性和兼容性,在许多工业设备中得到广泛应用;而Profinet提供了高速、高精度的通信能力,适合于复杂控制系统和实时应用,但两者之间的差异导致了…...
采购管理软件:改善初创企业的采购流程
说到初创企业,人们往往会联想到一个宽松的工作环境,缺乏严格的流程规范,以及公司收入的迅猛增长。这种快速增长可能会被认为会导致工作流程的无序和缺乏结构,使得员工在决策上具有较大的自由度,例如在采购方面。 在这…...
Python 是一种用途广泛的编程语言,应用于各个领域
1. 网络和互联网开发: Python 拥有丰富的框架和库,使其成为 Web 开发的理想选择。 框架: Django 和 Pyramid 用于构建复杂的 Web 应用。Flask 和 Bottle 则适合轻量级应用和 API。 库: Python 标准库支持处理 HTML、XML、JSON 和电子邮件。此外,还有强大…...
【VUE】9、VUE项目中使用VUEX完成状态管理
Vuex 是一个专为 Vue.js 应用程序设计的状态管理模式,它帮助开发者更有效地管理组件间共享的状态。在 Vue 项目中使用 Vuex,可以解决复杂应用中状态管理的困扰,确保状态变更的可追踪性和一致性。 1、Vuex 核心概念 State(状态&a…...
【eNSP模拟实验】单臂路由实现VLAN间通信
实验需求 如下图所示,辅导员办公室需要访问处在不同vlan的学生管理服务器的文件,那么如何实现两台终端相互通信呢?我们可以使用单臂路由的方式来实现。 单臂路由(router-on-a-stick)是指在路由器的一个接口上通过配置…...
哪些点权衡素材优秀与否
投放信息流素材的过程当中,我们究竟看哪几点来权衡这个素材是优秀的还是不优秀的?我们主要是以三个维度来看。 第一个就是 3 秒和 5 秒的完播率。很多优秀的素材它可能在前三秒和前五秒很平淡的一个过程,但是因为现在是一个非常快节奏的过程&…...
服务器数据恢复—2块硬盘离线且热备盘未完全激活的raid5数据恢复案例
服务器存储数据恢复环境: 北京某企业一台EMC FCAX-4存储上搭建一组由12块成员盘的raid5磁盘阵列,其中包括2块热备盘。 服务器存储故障: raid5阵列中两块硬盘离线,热备盘只有一块成功激活,raid瘫痪,上层LUN…...
Excel 学习手册 - 精进版(包括各类复杂函数及其嵌套使用)
作为程序员从未想过要去精进一下 Excel 办公软件的使用方法,以前用到某功能都是直接百度,最近这两天跟着哔哩哔哩上的戴戴戴师兄把 Excel 由里到外学了一遍,收获良多。程序员要想掌握这些内容可以说是手拿把掐,对后续 Excel 的运用…...
【CUDA】thrust进行前缀和的操作
接上篇文章,可以发现使用CUDA提供的API进行前缀和扫描时,第一次运行的时间不如共享内存访问,猜测是使用到了全局内存。 首先看调用逻辑: thrust::inclusive_scan(thrust::device, d_x, d_x N, d_x);第一个参数指定了设备&#x…...
Qt-QPainter的使用总结
一、QPainter介绍 QPainter是Qt框架中的一个类,主要用于在各种设备上进行2D图形绘制,如窗口、位图、打印设备等。它提供了一系列绘图函数,可以实现绘制点、线、曲线、形状、文本、图像以及复杂的绘画操作。 QPainter 与 QPaintDevice 和 QPaintEngine 类一起构成了Qt绘制系…...
轻松搞定GIS场景编辑,这款免费工具你一定要试试
如果你正苦恼于如何搞定GIS场景编辑,不妨来试试这款免费可视化工具——山海鲸可视化。经过本人测试,这款软件在GIS场景编辑上完全可以做到“零代码”操作,即使没有任何编程技能也可以在三维GIS世界中如鱼得水。现在,让我们一起来看…...
【笔记】一起齿轮箱的故障和相应的数学模拟实验
1.齿轮箱故障一例 出处:设备的故障识别 GearBox的频谱图,原作者不知道是从哪里拷贝来的,待会儿确认一下。 齿轮啮合频率GMF等于齿数乘以齿轮转速频率: ★齿轮啮合频率两边有边频,间距为1X(这是由冲击响应…...
官宣:百数低代码平台已顺利通过国家信息安全等级保护三级认证
在数字化转型浪潮中,企业对于数据安全与隐私保护的需求日益增强,尤其是在选择低代码开发平台时,信息安全等级保护(简称“等保”)成为众多客户关注的焦点。 近日,我们非常荣幸地向社会各界及广大用户宣布&a…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
