【Springboot】@ComponentScan 详解
文章目录
- @ComponentScan
- @ComponentScan ANNOTATION 和 REGEX
- @ComponentScan CUSTOM
- @ComponentScan ASSIGNABLE_TYPE
@ComponentScan
@ComponentScan
是 Spring 框架中的一个注解,用于自动扫描和注册容器中的组件。
使用 @ComponentScan
注解可以告诉 Spring 在指定的包或类路径下进行组件扫描,然后自动将被扫描到的组件注册到 Spring 容器中。以下是 @ComponentScan
注解的详细使用方法:
-
导入必需的依赖:确保你的项目中已经引入了 Spring 框架的相关依赖,以便使用
@ComponentScan
注解。 -
在配置类上添加注解:在 Spring 配置类上添加
@ComponentScan
注解,并指定要扫描的包或类路径。例如:
@Configuration
@ComponentScan("com.example.package")
public class AppConfig {// 其他配置
}
@ComponentScan ANNOTATION 和 REGEX
@ComponentScan
注解提供了 includeFilters
和 excludeFilters
属性,你可以使用这些过滤器来精确控制哪些组件会被扫描和注册到 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.ANNOTATION
、FilterType.REGEX
、FilterType.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
过滤器:
- 创建一个需要被扫描和注册的基类或接口:
public interface MyInterface {// 接口方法
}
- 创建需要被扫描和注册的具体实现类:
@Component
public class MyImplementation implements MyInterface {// 实现类逻辑
}
- 在配置类中使用
@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 阶开始逐步计算每一阶的方法数&…...

归并排序:分治思想的高效排序
目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法,由约翰冯诺伊曼在1945年提出。其核心思想包括: 分割(Divide):将待排序数组递归地分成两个子…...
从实验室到产业:IndexTTS 在六大核心场景的落地实践
一、内容创作:重构数字内容生产范式 在短视频创作领域,IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色,生成的 “各位吴彦祖们大家好” 语音相似度达 97%,单条视频播放量突破百万…...
Python爬虫实战:研究Restkit库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的有价值数据。如何高效地采集这些数据并将其应用于实际业务中,成为了许多企业和开发者关注的焦点。网络爬虫技术作为一种自动化的数据采集工具,可以帮助我们从网页中提取所需的信息。而 RESTful API …...
el-amap-bezier-curve运用及线弧度设置
文章目录 简介示例线弧度属性主要弧度相关属性其他相关样式属性完整示例链接简介 el-amap-bezier-curve 是 Vue-Amap 组件库中的一个组件,用于在 高德地图 上绘制贝塞尔曲线。 基本用法属性path定义曲线的路径,可以是多个弧线段的组合。stroke-weight线条的宽度。stroke…...

react-pdf(pdfjs-dist)如何兼容老浏览器(chrome 49)
之前都是使用react-pdf来渲染pdf文件,这次有个需求是要兼容xp环境,xp上chrome最高支持到49,虽然说iframe或者embed都可以实现预览pdf,但为了后续的定制化需求,还是需要使用js库来渲染。 chrome 49测试环境 能用的测试…...
PHP 表单 - 验证邮件和URL
PHP 表单 - 验证邮件和URL 引言 在Web开发中,表单是用户与网站交互的重要途径。一个功能完善的表单不仅可以收集用户数据,还能提高用户体验。在表单设计中,验证邮件地址和URL是常见的需求。本文将详细介绍如何在PHP中实现邮件和URL的验证&a…...

HarmonyOS Next 弹窗系列教程(3)
HarmonyOS Next 弹窗系列教程(3) 选择器弹窗 (PickerDialog) 介绍 选择器弹窗通常用于在用户进行某些操作(如点击按钮)时显示特定的信息或选项。让用户可以进行选择提供的固定的内容。 以下内容都属于选择器弹窗: …...
本地主机部署开源企业云盘Seafile并实现外部访问
Seafile是一个开源、专业、可靠的云存储平台;解决文件集中存储、共享和跨平台访问等问题。这款软件功能强大,界面简洁、操作方便。 本文将详细的介绍如何利用本地主机部署 Seafile,并结合nat123,实现外网访问本地部署的 Seafile …...

Go基本语法——go语言中的四种变量定义方法
前言 在go语言中,定义一个变量有四种方式,本文单从语法的层面来介绍这几种方式 单变量定义方法 1.var 变量名 类型,不进行初始化 例如,定义一个变量a后为其赋值,并且打印其值,运行结果如下 //1.不进行…...
Linux 用户层 和 内核层锁的实现
目录 一、系统调用futex介绍1. 核心机制2. 常见操作3. 工作流程示例(互斥锁)4. 优势5. 注意事项6. 典型应用 二、Linux中用户态的锁和内核的锁不是同一个实现吗?2.1 本质区别2.2 用户态锁如何工作(以 pthread_mutex 为例ÿ…...