当前位置: 首页 > news >正文

【Springboot】@ComponentScan 详解

文章目录

  • @ComponentScan
  • @ComponentScan ANNOTATION 和 REGEX
  • @ComponentScan CUSTOM
  • @ComponentScan ASSIGNABLE_TYPE

@ComponentScan

@ComponentScan 是 Spring 框架中的一个注解,用于自动扫描和注册容器中的组件。

使用 @ComponentScan 注解可以告诉 Spring 在指定的包或类路径下进行组件扫描,然后自动将被扫描到的组件注册到 Spring 容器中。以下是 @ComponentScan 注解的详细使用方法:

  1. 导入必需的依赖:确保你的项目中已经引入了 Spring 框架的相关依赖,以便使用 @ComponentScan 注解。

  2. 在配置类上添加注解:在 Spring 配置类上添加 @ComponentScan 注解,并指定要扫描的包或类路径。例如:

@Configuration
@ComponentScan("com.example.package")
public class AppConfig {// 其他配置
}

@ComponentScan ANNOTATION 和 REGEX

@ComponentScan 注解提供了 includeFiltersexcludeFilters 属性,你可以使用这些过滤器来精确控制哪些组件会被扫描和注册到 Spring 容器中。下面是一个示例,演示如何在 @ComponentScan 中使用过滤器:

@Configuration
@ComponentScan(basePackages = "com.example.package",includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = MyAnnotation.class),@ComponentScan.Filter(type = FilterType.REGEX, pattern = ".*ServiceImpl")},excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = ExcludeComponent.class)
)
public class AppConfig {// 其他配置
}

在上述示例中,我们使用 @ComponentScan 注解的 includeFilters 属性添加了两个过滤器:

  • 第一个过滤器使用 FilterType.ANNOTATION 类型和 MyAnnotation.class 注解类,它将只包含带有 MyAnnotation 注解的组件。
  • 第二个过滤器使用 FilterType.REGEX 类型和正则表达式 ".*ServiceImpl",它将只包含名称以 “ServiceImpl” 结尾的组件。

同时,我们还使用 @ComponentScan 注解的 excludeFilters 属性添加了一个过滤器:

  • 这个过滤器使用 FilterType.ASSIGNABLE_TYPE 类型和 ExcludeComponent.class 类,它将排除继承或实现了 ExcludeComponent 类的组件。

根据你的需求,你可以使用不同的过滤器类型(FilterType.ANNOTATIONFilterType.REGEXFilterType.ASSIGNABLE_TYPE 等)来定义自己的过滤规则。这样你就可以控制哪些组件会被扫描和注册到 Spring 容器中。

@ComponentScan CUSTOM

使用 @ComponentScan 注解时,你可以自定义过滤器来进一步控制哪些组件会被扫描和注册到 Spring 容器中。下面是一个示例,演示如何创建自定义过滤器:

首先,创建一个自定义过滤器类,实现 TypeFilter 接口,并重写其中的 match() 方法:

import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
import org.springframework.core.type.filter.TypeFilter;public class CustomFilter implements TypeFilter {@Overridepublic boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) {// 在这里编写你的过滤逻辑,根据需要返回 true 或 false// metadataReader 可以获取到正在扫描的组件的元数据信息,例如类名、注解等// metadataReaderFactory 可以获取到其他类的元数据信息// 示例:只匹配类名以 "Service" 结尾的组件String className = metadataReader.getClassMetadata().getClassName();return className.endsWith("Service");}
}

然后,在 @ComponentScan 注解中使用自定义过滤器:

@Configuration
@ComponentScan(basePackages = "com.example.package",includeFilters = @ComponentScan.Filter(type = FilterType.CUSTOM, classes = CustomFilter.class)
)
public class AppConfig {// 其他配置
}

在上述示例中,我们将 CustomFilter.class 作为过滤器传递给 @ComponentScan 注解的 includeFilters 属性。

自定义过滤器类实现了 TypeFilter 接口,并重写了 match() 方法。在 match() 方法中,你可以编写自己的过滤逻辑,根据需要返回 true 或 false 来确定是否匹配当前扫描到的组件。上述示例中的过滤逻辑只匹配类名以 “Service” 结尾的组件。

通过使用自定义过滤器,你可以根据更复杂的条件和逻辑来决定哪些组件会被扫描和注册到 Spring 容器中。这样可以实现更精确的组件管理和配置。

@ComponentScan 注解中,可以使用 FilterType.ASSIGNABLE_TYPE 类型的过滤器来扫描和注册与指定类型相匹配的组件。这个过滤器会将与指定类型相同或者是其子类或实现类的组件注册到 Spring 容器中。

@ComponentScan ASSIGNABLE_TYPE

下面是一个示例,演示如何在 @ComponentScan 中使用 FilterType.ASSIGNABLE_TYPE 过滤器:

  1. 创建一个需要被扫描和注册的基类或接口:
public interface MyInterface {// 接口方法
}
  1. 创建需要被扫描和注册的具体实现类:
@Component
public class MyImplementation implements MyInterface {// 实现类逻辑
}
  1. 在配置类中使用 @ComponentScan 注解,并设置 includeFilters 属性来包含 FilterType.ASSIGNABLE_TYPE 类型的过滤器:
@Configuration
@ComponentScan(basePackages = "com.example.package",includeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = MyInterface.class)
)
public class AppConfig {// 其他配置
}

在上述示例中,我们将 MyInterface.class 作为过滤器传递给 @ComponentScan 注解的 includeFilters 属性,表示只有实现了 MyInterface 接口的组件才会被扫描和注册到 Spring 容器中。这样,MyImplementation 类就会被自动注册到容器中。

通过使用 FilterType.ASSIGNABLE_TYPE 过滤器,你可以方便地根据类的层次结构来选择性地扫描和注册组件。这使得你可以将特定类型或其子类或实现类的组件自动注册到 Spring 容器中,从而实现更灵活的组件管理和配置。

相关文章:

【Springboot】@ComponentScan 详解

文章目录 ComponentScanComponentScan ANNOTATION 和 REGEXComponentScan CUSTOMComponentScan ASSIGNABLE_TYPE ComponentScan ComponentScan 是 Spring 框架中的一个注解,用于自动扫描和注册容器中的组件。 使用 ComponentScan 注解可以告诉 Spring 在指定的包或…...

flask-----信号

安装: flask中的信号使用的是一个第三方插件,叫做blinker。通过pip list看一下,如果没有安装,通过以下命令即可安装blinker: pip install blinker flask其中有内置的信号 template_rendered _signals.signal(temp…...

10_Vue3 其它的组合式API(Composition API)

Vue3 中的其它组合式API 1.shallowReactive 与 shallowRef 2. readonly 与 shallowReadonly 3.toRaw 与 markRaw 4.customRef 5.provide 与 inject 6.响应式数据的判断...

COCOS项目运行的时候图片模糊的原因

1、首先。用X坐标来分析,如果size*Anchor Position有小数,如上图57*0.5667695.5。这样就会导致x模糊。如果y同样计算结果包含小数,那么y也会模糊。xy同时模糊的情况是最模糊的。 2、如果当前node没有问题,那么就要检查上级node是…...

Python中搭建IP代理池的妙招

在Python的爬虫世界里,你是否也想搭建一个功能强大的IP代理池,让你的爬虫无忧无虑地畅游各大网站?今天,我就来教你使用Scrapy框架搭建IP代理池,让你的爬虫更加智能、高效!跟着我一步一步来,轻松…...

学习pytorch 2

学习pytorch 2 2. dataset实战代码数据集 2. dataset实战 B站小土堆视频 代码 from torch.utils.data import Dataset from PIL import Image #import cv2 import osclass MyData(Dataset):def __init__(self, root_dir, label_dir):self.root_dir root_dirself.label_dir …...

elementui动态表单实现计算属性携带参数,并将计算出的值四舍五入保留两位小数

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言方法1方法2结论 前言 写项目的时候,遇到需要在动态表单中,将同一级输入框输入的内容计算出来,并动态显示,发现c…...

嵌入式面试5 -makefile shell

2、 如果有一个简单的helloworld项目目录如下: tree helloworld helloworld |– file2.h |– file1.cpp |– file2.cpp 请编写一个Makefile文件。 答: TARGET helloworld CXX g COMPILE : $(COMPILE) file1.cpp COMPILE : $(COMPILE) file2.cpp OBJE…...

获40余家主机厂青睐,这家OTA「吸金王」完成超亿元B2轮融资!

继今年4月获得上汽集团旗下尚颀资本及其合作方山高投控的投资后,近日上海艾拉比智能科技有限公司(以下简称“艾拉比”)正式完成总额过亿元的B2轮融资,新的投资方为聚卓资本、老股东国科新能继续增持,势能资本持续担任独…...

CGI, FastCGI, WSGI, uWSGI, uwsgi分别是什么?

CGI 1、通用网关接口(Common Gateway Interface/CGI),CGI描述了服务器(nginx,apache)和请求处理程序(django,flask,springboot web框架)之间传输数据的一种标准. 2.所有bs架构软件都是遵循CGI协议的 3.一…...

Android T 窗口层级相关的类(更新中)

窗口在App端是以PhoneWindow的形式存在,承载了一个Activity的View层级结构。这里我们探讨一下WMS端窗口的形式。 可以通过adb shell dumpsys activity containers 来看窗口显示的层级 窗口容器类 —— WindowContainer类 /*** Defines common functionality for c…...

【云原生】深入掌握k8s中Pod和生命周期

个人主页:征服bug-CSDN博客 kubernetes专栏:kubernetes_征服bug的博客-CSDN博客 目录 1 什么是 Pod 2 Pod 基本操作 3 Pod 运行多个容器 4 Pod 的 Labels(标签) 5 Pod 的生命周期 1 什么是 Pod 摘取官网: Pod | Kubernetes 1.1 简介 Pod 是可以在 …...

openKylin+KingbaseES+Nginx安装

openKylin开放麒麟开启ssh 一、查看ssh服务是否开启。 终端输入命令:sudo ps -e |grep ssh ,只显示如下内容则证明未安装ssh服务。 2127 ? 00:00:00 ssh-agent若显示如下内容则证明ssh服务已开启。 1657 ? 00:00:00 ssh-agent 2349 ?…...

lc1.两数之和

暴力解法:两个for循环,寻找和为target的两个数的索引 时间复杂度:O(n2) 空间复杂度:O(1) 哈希表:遍历数组,将nums数组的数和索引分别存储在map的key和value中,一边遍历,一边寻找是…...

c# 初始化列表,并给列表里面所有的元素进行初始化

Enumerable.Repeat 方法是用于生成一个包含指定元素重复若干次的序列。它接受两个参数,第一个参数是要重复的元素,第二个参数是重复次数。 下面是 Enumerable.Repeat 方法的用法和示例: using System; using System.Collections.Generic; u…...

Java笔记(三十):MySQL(上)-- 数据库、MySQL常用数据类型、DDL、DML、多表设计

一、数据库 0、MySQL安装,IDEA配置MySQL 用MySQL installer for windows(msi)MySQL默认安装位置:C:\Program Files\MySQL\MySQL Server 8.0配置环境变量使用前先确保启动了mysql服务my.ini位置:C:\ProgramData\MySQL…...

SQL笔记-正态分布函数(二)

在Oracle数据库中,并没有直接提供计算正态分布函数(累积分布函数)的内置函数。不过,你可以使用PL/SQL编程语言来实现一个自定义的正态分布函数。下面是一个简单的示例: CREATE OR REPLACE FUNCTION normdist(x NUMBER…...

【LeetCode】数据结构题解(12)[用栈实现队列]

用栈实现队列 😉 1.题目来源👀2.题目描述🤔3.解题思路🥳4.代码展示 所属专栏:玩转数据结构题型❤️ 🚀 >博主首页:初阳785❤️ 🚀 >代码托管:chuyang785❤️ &…...

嵌入式Linux下LVGL的移植与配置

一.sdk源码下载路径 1.官方源码下载路径如下: ​​​​​​ https://github.com/lvgl/lvgl git下载方式 git clone https://github.com/lvgl/lvgl.git 2.个人移植好的源码8.2版本下载路径: 链接:https://pan.baidu.com/s/1jyqIennsQpv-RB4RyKvZyg?pwdc68e 提取…...

leetcode每日一练-第70题-爬楼梯

一、思路 动态规划 二、解题方法 使用一个动态规划数组 dp 来记录到达每个台阶的不同方法数。初始情况下,当台阶数为 1 时,方法数为 1,当台阶数为 2 时,方法数为 2。然后,我们从第 3 阶开始逐步计算每一阶的方法数&…...

设备使用RTMP推流到安防监控EasyCVR视频汇聚平台,为何只有FLV格式无法播放?

TSINGSEE青犀视频安防监控视频汇聚平台EasyCVR基于云边端一体化架构,具有强大的数据接入、处理及分发能力,可提供视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、云台控制、语音对讲、智能分析等功能。 智能视频监控平台EasyCVR可…...

arcgis宗地或者地块四至权利人信息提取教程

ARCGIS怎样将图斑四邻的名称及方位加入其属性表 以前曾发表过一篇《 如何把相邻图斑的属性添加在某个字段中》的个人心得,有些会员提出了进一步的要求,不但要相邻图斑的名称,还要求有方位,下面讲一下自己的做法。 基本思路是:连接相邻图斑质心,根据连线的角度确定相邻图斑…...

乐鑫首创|使用 ESP RainMaker® 私有云定制 Matter 生态

ESP RainMaker 是乐鑫的 AIoT 云平台,支持客户自主部署私有物联网云,从而全面掌握数据所有权和管理权,实现定制功能与服务。ESP RainMaker 云后端采用 AWS 无服务器架构,拥有开源的 iOS 和 Android 移动端 APP、第三方语音助手集成…...

【算法|数组】快慢指针

算法|数组——快慢指针 引入 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你…...

C++字符串:使用 std::string

C字符串&#xff1a;使用 std::string 初始化方法一 std::string 变量名称 { “字符串”}&#xff1b; std::string str { " 这是一个字符串" }&#xff1b;std::cout << str; std::cin >> str;初始化方法二 std::string 变量名称 { “字符串”&#x…...

目前Java后端就业前景怎么样?

前言 并不乐观&#xff0c;看看现在的就业形式就知道了&#xff0c;基本上是僧多粥少的情况&#xff0c;你可能会看到很多编程语言排行榜或者流行榜中Java的排名很高&#xff0c;如同下面这种&#xff1a; 看排名确实可以粗略的得知语言当下的流行度、使用率&#xff0c;但是它…...

C语言基础(持续更新)

常用函数 strrchr 描述 C 库函数 char *strrchr(const char *str, int c) 在参数 str 所指向的字符串中搜索最后一次出现字符 c&#xff08;一个无符号字符&#xff09;的位置。测试代码 #include "stdio.h" #include "string.h"int main() {printf(&q…...

从源码层面深度剖析Spring循环依赖 | 京东云技术团队

以下举例皆针对单例模式讨论 图解参考 https://www.processon.com/view/link/60e3b0ae0e3e74200e2478ce 1、Spring 如何创建Bean&#xff1f; 对于单例Bean来说&#xff0c;在Spring容器整个生命周期内&#xff0c;有且只有一个对象。 Spring 在创建 Bean 过程中&#xff0…...

Distance 2023牛客暑期多校训练营6 B

登录—专业IT笔试面试备考平台_牛客网 题目大意&#xff1a;给出两个长度为n的数组a&#xff0c;b&#xff0c;每次操作可以令一个数1&#xff0c;将a的一个子集A变成和b的一个子集B变成完全相同需要的最少操作数为C(A,B)&#xff0c;求对于a的所有子集对所有b的子集的C(A,B)的…...

【Pandas】学习笔记之groupby()、agg()、transform()

在数据分析过程中经常需要对数据集进行分组&#xff0c;并且统计均值&#xff0c;最大值等等。那么 groupby() 的学习就十分有必要了 groupby(): 分组 官方文档&#xff1a; DataFrame.groupby(byNone, axis0, levelNone, as_indexTrue, sortTrue, group_keysTrue, observedF…...

想要将网站信息插到文本链接怎么做/如何建站

如果启动前不对Linux内核做任何更改&#xff0c;那么Redis启动会报出警告&#xff0c;共三个&#xff1a;如下图所示第一个警告&#xff1a;The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.意思是…...

网站制作关键词/3小时百度收录新站方法

描述 给定一个整数&#xff08;32位有符号整数&#xff09;&#xff0c;写一个方法判断这个数字是否为4的乘方。 样例 - 样例 1:输入&#xff1a;num 16 输出&#xff1a;True- 样例 2:输入&#xff1a;num 5 输出&#xff1a;False挑战 你能否不使用循环/递归解决这个问…...

建设购物网站/百度一下百度搜索

1&#xff0c;Socket通信原理图解 2&#xff0c;Socket套接字概述&#xff1a; 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。 通信的两端都有Socket。 网络通信其实就是Socket间的通信。 数据在两个Socket间通过IO流传输。 Socket在应…...

做bjd娃娃的手工网站/杭州新站整站seo

jQuery鼠标换轮滚动事件1、鼠标混轮滚动事件2、添加class属性3、实现屏幕滚动效果css代码部分html与javascript部分1、鼠标混轮滚动事件 代码如下所示&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">…...

越秀区建网站公司/直播网站排名

我不断听到队友说 “测试不是我的工作&#xff0c;我是<insert_role>”或“设计产品不是我的工作&#xff0c;我是<insert_role>” 如果不加以检查&#xff0c;我会对消息引起的行为感到非常厌倦。 一个团队不仅仅是其各个部分的总和&#xff0c;一个团队具有协…...

网站插件代码/手把手教你优化网站

前言 在K8S运行的服务&#xff0c;从简单到复杂可以分成三类&#xff1a;无状态服务、普通有状态服务和有状态集群服务。下面分别来看K8S是如何运行这三类服务的。 无状态服务 K8S使用RC&#xff08;或更新的Replica Set&#xff09;来保证一个服务的实例数量&#xff0c;如果…...