当前位置: 首页 > 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 阶开始逐步计算每一阶的方法数&…...

RK3588/RK3568嵌入式开发:从通用镜像到定制分区镜像的完整实践指南

1. 项目概述:从“通用”到“专属”的镜像进化最近在折腾RK3588和RK3568平台时,我发现了一个挺有意思的升级点:开发板和核心板的镜像支持定制分区了。这听起来可能有点技术化,但说白了,就是以前我们拿到的系统镜像&…...

SEO优化?你的网站要是还没学会这些方法就亏大了

说起来你可能不信,我刚接触SEO优化那会儿,差点把自家网站整成“数字废墟”。今天翻出那些踩过的坑,跟你唠唠怎么让搜索引擎爱上你的小破站。关键词研究:别再用脚趾头猜了你可能试过对着键盘一顿乱敲,把“最好”“第一”…...

CANN/asc-devkit LogicalAnds临时空间接口

GetLogicalAndsMaxMinTmpSize 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: ht…...

从C++代码到机器指令:用OD和IDA手把手拆解一个简单的main函数(附寄存器图解)

从C代码到机器指令:用OD和IDA手把手拆解一个简单的main函数(附寄存器图解) 在逆向工程的世界里,理解高级语言如何转化为底层机器指令是一项基础而关键的技能。本文将以一个最简单的C main 函数为例,带你一步步追踪其从…...

大数据之安装zookeeper

下载 官方下载地址:https://archive.apache.org/dist/zookeeper/ 解压 tar -zxvf zookeeper-3.4.13.tar.gz 创建目录 日志目录和数据目录 cd zookeeper-3.4.13/ # 数据目录 mkdir data # 数据目录的目录 mkdir data-log # 日志目录 mkdir logs 修改配置 日志…...

终极指南:掌握WinPmem Windows内存取证采集核心技术

终极指南:掌握WinPmem Windows内存取证采集核心技术 【免费下载链接】WinPmem The multi-platform memory acquisition tool. 项目地址: https://gitcode.com/gh_mirrors/wi/WinPmem WinPmem作为Windows平台物理内存采集的标杆工具,为安全分析师和…...

工业视觉系统选型实战:CCD相机与镜头参数计算全解析

1. 项目概述:从“神坛”到“工具箱”的CCD相机与镜头选型 在自动化视觉检测、精密测量和机器视觉领域,CCD工业相机和镜头的选型与参数计算,常常被新手工程师视为一个“黑箱”或“玄学”问题。客户一问到“这个系统能看多清楚?”、…...

3分钟解锁Translumo:Windows平台屏幕实时翻译的终极解决方案

3分钟解锁Translumo:Windows平台屏幕实时翻译的终极解决方案 【免费下载链接】Translumo Advanced real-time screen translator for games, hardcoded subtitles in videos, static text and etc. 项目地址: https://gitcode.com/gh_mirrors/tr/Translumo 还…...

思源宋体TTF实战秘籍:三步搞定专业中文字体配置

思源宋体TTF实战秘籍:三步搞定专业中文字体配置 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 还在为商业项目寻找合适的中文字体而烦恼吗?Source Han Serif C…...

告别默认路径!在Win11上自定义WSL2安装位置(以Ubuntu 20.04为例)

深度掌控WSL2安装路径:Win11下Ubuntu 20.04的定制化部署指南 对于追求系统整洁和高效管理的开发者而言,Windows Subsystem for Linux 2(WSL2)的默认安装路径往往成为心头之患。本文将揭示如何从源头掌控WSL2的安装位置&#xff0c…...