SpringBoot中的Component和ComponentScan注解工作原理

Spring IoC 容器的工作是通过管理对象的生命周期和配置来保持业务逻辑清晰,但是 Spring 容器并不会自动知道要管理哪些 bean。所以我们来告诉 Spring 应该处理哪些 bean 以及如何处理,很简单这就是 Spring 的 @Component 和 @ComponentScan 注释的作用所在。

Spring的@Component注释的作用

创建一个由 Spring 管理的 JavaBean,那么引起 IoC 容器注意的一种方法就是用 Spring 的 @Component 注释来装饰该类,其他注解@Service等同于@Component,这里以@Component注解来统一说明。

以下代码显示两个类由 Spring 容器管理,因此都使用 @Component 注释进行修饰。但是,简单地将 @Component 注释添加到 JavaBean 并不意味着它将自动由Spring 框架进行管理。只有当明确告知容器搜索 @Component 注释的类时,注释才会使 Spring 管理修饰的类。这就是 @ComponentScan 注释的作用所在。

@Component
public class Score {int wins, losses, ties;
}@Component
public class Game {@Autowiredprivate Score score;public void playTheGame(String gesture) {score.wins++;}
}

Spring 的 @ComponentScan 注解起什么作用?

如果在初始化期间,Spring 容器加载了一个使用 @ComponentScan 注释修饰的 bean,Spring 将在该类的包和子包中搜索带有 @Component 注释的类。如果找到,Spring IoC 容器将自动管理它们。

在下面的代码中,SimpleExample 类既用 @ComponentScan 注释修饰,又在 Spring IoC 容器初始化时加载到 Spring 的 ApplicationContext 中。ApplicationContext 是代表 Spring IoC 容器的 Java 接口的名称。

@ComponentScan
public class SimpleExample {
public static void main(String[] args) {SpringApplication springApp = new SpringApplication(Score.class, Game.class);ApplicationContext springContainer = springApp.run(args);Game game = springContainer.getBean(Game.class);game.playTheGame("rock");System.out.print(game.score.wins);System.out.print(game.score.wins); // prints 1}
}

当此代码运行时,Game类和Score类都由Spring容器管理。当main方法运行时,会从容器中拉取Game类的实例,并通过Spring的依赖注入机制初始化Game的分数,当将获胜次数打印到控制台时,显示了正确的输出1。

Spring 的 @Component 和 @ComponentScan 一起

可以看到,@ComponentScan 和 @Component 注释一起起作用。@Component 注释表示如果在组件扫描期间发现某个类,则该类应该由Spring IoC 容器进行管理,而使用 @ComponentScan 注释修饰的类才是真正触发组件扫描的类。

@SpringBootApplication注解

实际使用中我们用到更多的是这个@SpringBootApplication注解,并没有看到ComponentScan,那是因为@SpringBootApplication这个注解帮我们做了很多事情,已经自动帮我引入了@ComponentScan注解,同时有默认的扫描Component策略。
在这里插入图片描述

ComponentScan扫描包的策略

指定包
@ComponentScan(basePackages = "com.example")
public class SpingbootBannerDemoApplication {public static void main(String[] args) {SpringApplication.run(SpingbootBannerDemoApplication.class, args);}}
过滤掉指定的class
@ComponentScan(basePackages = "com.example", excludeFilters = {@ComponentScan.Filter(type= FilterType.CUSTOM, classes={HelloWorld.class}) })
public class SpingbootBannerDemoApplication {public static void main(String[] args) {SpringApplication.run(SpingbootBannerDemoApplication.class, args);}}
更多用法

在这里插入图片描述

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

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

相关文章

算法题总结(二十)——并查集

并查集理论基础 并查集常用来解决集合连通性问题,两个节点在不在一个集合,也可以将两个节点添加到一个集合中。 大白话就是当我们需要判断两个元素是否在同一个集合里的时候,我们就要想到用并查集。 并查集主要有两个功能: 将…

[数据采集技术:实践02]:requests,lxml,BeautifulSoup模块的使用

要求 1.创建项目文件夹,命名为:学号-2,如:20220001-2。后续所有文 件均放在此文件夹中。 requests 模块和 lxml 模块中的 XPath的使用 2.新建 test1.py 文件,使用 requests 模块和 lxml 模块中的 XPath,…

Spring Boot 实现 WebSocket(注解方式)

本文介绍如何使用 Spring Boot 的注解方式实现一个简单的 WebSocket 服务&#xff0c;支持客户端与服务器之间进行实时通信。 1. 引入依赖 在 pom.xml 文件中添加 WebSocket 相关依赖。 <dependencies><!-- Spring Boot WebSocket 支持 --><dependency>&l…

linux介绍与基本指令

前言 本次博客将会讲解linux的来源历史、linux操作系统的理解以及它的一些基本指令。 1.linux的介绍 linux的来源 linux的来源最初还是要说到unix操作系统的。 1968年&#xff0c;一些来自通用电器公司、贝尔实验室和麻省理工学院的研究人员开发了一个名叫Multics的特殊操作…

Kafka系列之:Kafka集群新增节点后实现数据均衡

Kafka系列之:Kafka集群新增节点后实现数据均衡 一、背景二、Kafka集群快速负载均衡方案三、按照Topic负载均衡Kafka系列之:使用Kafka Manager实现leader分区平衡和broker节点上分区平衡一、背景 Kafka集群新增节点,要使得每个节点数据均衡,在增加完kafka topic分区后,要进…

Qt中自定义qDebug打印信息的宏(文件名,行数,函数名,日期,时间等前缀)并取消打印

使用qDebug()打印信息时&#xff0c;默认打印"<<"符号后面的信息。 通过自定义宏&#xff0c;可以额外打印文件名&#xff0c;行数&#xff0c;函数&#xff0c;日期、时间等前缀&#xff0c;方便快速定位调式信息的位置。 同时&#xff0c;可以定义宏取消打…

AI学习指南深度学习篇-对比学习的数学原理

AI学习指南深度学习篇——对比学习的数学原理 引言 在深度学习的领域中&#xff0c;对比学习作为一种无监督学习方法&#xff0c;逐渐引起了学术界和工业界的广泛关注。对比学习通过对样本间的相似性度量&#xff0c;来提升模型的特征表示能力&#xff0c;成为近年来研究的热…

C语言 | Leetcode C语言题解之第502题IPO

题目&#xff1a; 题解&#xff1a; #define MIN(a, b) ((a) < (b) ? (a) : (b)) #define MAX_INT_NUMBER 0x7FFFFFFEtypedef struct {int capital;int profit; } ProNode;int CompareProfit(const ProNode *a, const ProNode *b) { /* 从大到小排序 */return b->pr…

根据发生异常的汇编指令以及函数调用堆栈,从内存的角度出发,估计出问题的可能原因,确定排查方向,快速定位C++软件问题

目录 1、前言 2、初步分析dump文件 3、加载更多模块的pdb文件&#xff0c;可能能看到更多行的函数调用堆栈 4、从内存的角度去看&#xff0c;估计是访问了野指针导致的&#xff0c;沿着这个怀疑的方向快速地定位了问题 5、最后 C软件异常排查从入门到精通系列教程&#xf…

力扣OJ算法题:合并两个有序链表

—————————————————————————————————————————— 正文开始 OJ算法题&#xff1a;合并两个有序链表 思路 创建一个新的空链表&#xff08;可以用malloc优化&#xff09;和两个指针L1、L2分别指向两个链表&#xff0c;遍历两个链表&am…

taro底部导航,Tabbar

没有特别的幸运&#xff0c;那么就特别的努力&#xff01;&#xff01;&#xff01; 配置信息 官方给出&#xff1a; 在 app.config 中按正常填写 tabBar 项的相关配置&#xff08;为了向下兼容&#xff09;&#xff0c;并把 tabBar 项的 custom 字段设置为 true。但我试过 c…

Chromium 中chrome.contextMenus扩展接口实现分析c++

一、chrome.contextMenus 使用 chrome.contextMenus API 向 Google Chrome 的上下文菜单中添加项。您可以选择从右键菜单中添加的对象类型&#xff0c;例如图片、超链接和页面。 权限 contextMenus 您必须在扩展程序的清单中声明 "contextMenus" 权限&#xff0c…

R语言机器学习算法实战系列(十二)线性判别分析分类算法 (Linear Discriminant Analysis)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍LDA的原理LDA的步骤教程下载数据加载R包导入数据数据预处理数据描述数据切割构建模型预测测试数据评估模型模型准确性混淆矩阵模型评估指标ROC CurvePRC Curve保存模型总结优点:缺…

Ubuntu(22.04)本地部署Appsmith

Ubuntu&#xff08;22.04&#xff09;安装Appsmith 简要介绍 Appsmith 是一个开源的低代码开发平台&#xff0c;旨在帮助开发者和非开发者快速构建定制化的内部应用程序和管理工具。通过直观的拖拽界面和丰富的预配置组件&#xff0c;Appsmith 让用户无需编写大量代码即可创建…

Postman使用-基础篇

前言 本教程将结合业界广为推崇和使用的RestAPI设计典范Github API&#xff0c;详细介绍Postman接口测试工具的使用方法和实战技巧。 在开始这个教程之前&#xff0c;先聊一下为什么接口测试在现软件行业如此重要&#xff1f; 为什么我们要学习Postman&#xff1f; 现代软件…

数据轻松上云——Mbox边缘计算网关

随着工业4.0时代的到来&#xff0c;工厂数字化转型已成为提升生产效率、优化资源配置、增强企业竞争力的关键。我们凭借其先进的边缘计算网关与云平台技术&#xff0c;为工厂提供了高效、稳定的数据采集与上云解决方案。本文将为您介绍Mbox边缘计算网关如何配合明达云平台&…

React 基础阶段学习计划

React 基础阶段学习计划 目标 能够创建和使用React组件。理解并使用State和Props。掌握事件处理和表单处理。 学习内容 环境搭建 安装Node.js和npm 访问 Node.js官网 下载并安装最新版本的Node.js。打开终端或命令行工具&#xff0c;输入 node -v 和 npm -v 检查是否安装…

【Python】爬虫

Python爬虫是一种自动化下载网页内容的程序。以下是一个简单的Python爬虫示例&#xff0c;使用requests库获取网页&#xff0c;并用BeautifulSoup解析网页。 首先&#xff0c;你需要安装必要的库&#xff1a; pip install requests pip install beautifulsoup4 以下是一个简…

基于SpringBoot微信小程序的书院预约系统【附源码】

基于SpringBoot微信小程序的书院预约系统 效果如下&#xff1a; 微信小程序首页界面 用户登录界面 书院信息界面 会议室界面 管理员登录界面 管理员主界面 用户界面 书院信息界面 会议室界面 会议室预约界面 研究背景 随着社会的快速发展&#xff0c;计算机技术的影响是全面…

SpringBoot 单元测试 - 登录认证在 Spring Boot 上的标准单元测试写法。

&#x1f449; 请投票支持这款 全新设计的脚手架 &#xff0c;让 Java 再次伟大&#xff01; 不要使用 SpringBootTest 使用 SpringBootTest 进行单元测试会启动整个 Spring Boot 容器&#xff0c;并引入整个项目的 development&test 依赖。缺点是速度慢、体积大、测试目标…