SpringBoot默认包扫描机制及使用@ComponentScan指定扫描路径

2023-11-01

SpringBoot默认包扫描机制

标注了@Component和@Component的衍生注解如@Controller,@Service,@Repository就可以把当前的Bean加入到IOC容器中。那么SpringBoot是如何知道要去扫描@Component注解的呢。@ComponentScan做的事情就是告诉Spring从哪里找到bean

SpringBoot默认包扫描机制: 从启动类所在包开始,扫描当前包及其子级包下的所有文件。

我们可以通过以下的测试来验证一下。

启动应用并访问BannerController这个控制器,目录结构如图

访问结果正常

当把BannerController移动到上一级目录,应用可以正常启动

但是再次访问刚才的路径时却出现了如下错误,代码是没有变动的,是Controller扫描 不到了。

实际上SpringBoot是通过@ComponentScan进行扫描。默认情况下,入口类上面的@SpringBootApplication里面有一个@ComponentScan,也就相当于@ComponentScan标注在入口类上。所以默认情况下,扫描入口类同级及其子级包下的所有文件。当我们想自己制定包扫描路径就需要加一个@ComponentScan

@ComponentScan的使用

常用参数含义

basePackagesvalue: 用于指定包的路径,进行扫描(默认参数)

basePackageClasses: 用于指定某个类的包的路径进行扫描

includeFilters: 包含的过滤条件

FilterType.ANNOTATION:按照注解过滤

FilterType.ASSIGNABLE_TYPE:按照给定的类型

FilterType.ASPECTJ:使用ASPECTJ表达式

FilterType.REGEX:正则

FilterType.CUSTOM:自定义规则

excludeFilters: 排除的过滤条件,用法和includeFilters一样

nameGenerator: bean的名称的生成器

useDefaultFilters: 是否开启对@Component,@Repository,@Service,@Controller的类进行检测

指定要扫描的包

上述例子,如果想扫描启动类上一级包,使用@ComponentScan指定包扫描路径,即可将BannerController加入到容器

@SpringBootApplication@ComponentScan("com.lin")publicclassMissyouApplication{publicstaticvoidmain(String[] args){
        SpringApplication.run(MissyouApplication.class, args);}}1234567

excludeFilters 排除某些包的扫描

测试类准备:

@ControllerpublicclassBannerController{BannerController(){
        System.out.println("Hello BannerController");}}--------------------------------------------------------------------@ServicepublicclassTestService{TestService(){
        System.out.println("Hello TestService");}}12345678910111213

目录结构如下:

启动类上加@ComponentScan指定扫描lin这个包并排除@Controller这个注解标注的类

@SpringBootApplication@ComponentScan(value ="com.lin",
        excludeFilters ={@ComponentScan.Filter(type = FilterType.ANNOTATION,value ={Controller.class})})publicclassMissyouApplication{publicstaticvoidmain(String[] args){
        SpringApplication.run(MissyouApplication.class, args);}}123456789

启动应用,控制台打印出了TestService而没有BannerController

@Component与@ComponentScan

在某个类上使用@Component注解,表明当需要创建类时,这个被注解标注的类是一个候选类。就像是有同学在举手。

@ComponentScan 用于扫描指定包下的类。就像看都有哪些举手了。

原文链接:https://blog.csdn.net/xfx_1994/article/details/103976575

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot默认包扫描机制及使用@ComponentScan指定扫描路径 的相关文章

随机推荐

  • linux查看进程 显示,Linux如何查看和控制进程

    Linux如何查看和控制进程 前言 程序是保存在外部存储介质 如硬盘 中的可执行机器代码和数据的静态集合 而进程是在CPU及内存中处于动态执行状态的计算机程序 在Linux系统中 每个程序启动后可以创建一个或多个进程 例如 提供Web服务的
  • 等高线种类及特点

    地形图上的等高城分为首曲线 计曲线 间曲线和助曲线四种 见下图 首曲线 又叫基本等高线 是按规定的等高距 由平均海水面起算而测绘的细实线 线粗0 1毫米 用以显示地貌的基本形态 计曲线 又叫加粗等高线 规定从高程起算面 平均海水面 起算的首
  • 一个月,英语能提高多少?附资料分享

    学习语言是一个漫长的过程 但对于我这样一个英语小白 利用业余时间 一个月的学习 还是能看到不少的进步 除了听 说 读 写等能力方面有提升之外 最大的收获就是培养了英语学习和运用的兴趣 这样的结果对我来说 还是很满意的 自然也多了继续探索英语
  • STM32CubeMX代码生成和点亮LED

    所需工具STM32CubeMX和Keil5 1 先打开STM32CubeMX软件 点击New Project新建工程 2 在搜索框中搜索你的项目芯片 3 搜索出来有两个不同封装的芯片 写程序没区别 但是这个软件可以生成IO说明文档 可能会导
  • 【恒指早盘分析】10.8恒指今日复盘及后市思路

    10月8日消息 美股周一震荡收跌 市场正关注国际贸易局势的进展 美联储官员讲话以及经济数据 今日开盘 港股恒指高开0 11 随后一度涨逾1 重返26000点 截至午间收盘 恒生指数踏浪点神 1376338 669 73 46 0 28 涨0
  • justify-content、align-content、align-items、align-self的区别

    提示 CSS flex direction属性指定了内部元素是如何在 flex 容器中布局的 定义了主轴的方向 正方向或反方向 默认主轴为正方向 侧轴 与主轴垂直的轴叫侧轴 justify 使齐行 align 排列 使成一条直线 wrap
  • VBJSON报错:缺少:语句结束

    项目中使用JSON库VBJSON时报错 编译错误 缺少 语句结束 cJSONScript和cStringBuilder报相同的错误 都在第一行 VERSION 1 0 CLASS 研究了半天没啥结果 之前使用这个库的时候没有什么问题 所以判
  • Spring boot踩坑日记——ERROR c.n.d.s.t.d.RedirectingEurekaHttpClient - Request execution error

    eureka启动报错 2018 12 21 17 20 16 480 main ERROR c n d s t d RedirectingEurekaHttpClient Request execution error com sun je
  • https://github.com/qiangqiang666/demo

  • Apache Log4j2远程代码执行漏洞复现(CVE-2021-44228)-----记第一次反弹shell

    目录 靶场搭建 漏洞测试 漏洞利用 总结 靶场搭建 因为没有服务器所以只能在本地搭建 在虚拟机上拉取文件 git clone https github com vulhub vulhub git Vulhub Docker Compose
  • MariaDB安装教程

    注 从MariaDB 10 4 3开始 不再提供预构建的数据目录 并且用户需要运行mysql install db exe来创建数据目录 1 解压到自定义路径 E MariaDB mariadb 10 5 4 winx64 2 将其中的bi
  • java 类之间相互引用实例探索

    本文记录一下自己对类之间相互引用的探索 如有错误 希望不吝赐教 问题一 类之间相互引用依赖会不会引用死循环 不会 例如 A类中声明一个B类的引用 B类中也声明一个A类的引用 因为类之间的引用相当于指针 声明的时候不会分配对象 即使你在A构造
  • Windows下使用Redis(一)安装使用

    一 Redis 是什么 Redis 是一款依据BSD开源协议发行的高性能Key Value存储系统 cache and store 它通常被称为数据结构服务器 因为值 value 可以是 字符串 String 哈希 Map 列表 list
  • Error creating bean with name 'sessionFactory' defined in class path resource [...]

    已解决 spring hibernate 报错原因 applicationContext xml中没有引入实体映射文件 实体映射文件
  • 文盘 Rust -- tonic-Rust grpc 初体验

    gRPC 是开发中常用的开源高性能远程过程调用 RPC 框架 tonic 是基于 HTTP 2 的 gRPC 实现 专注于高性能 互操作性和灵活性 该库的创建是为了对 async await 提供一流的支持 并充当用 Rust 编写的生产系
  • Ceph运维存储 命令管理操作

    分布式存储运维操作 集群服务管理常用命令 统一节点上的ceph conf文件 将admin节点上修改的ceph conf 推送给所有其他节点 overwrite conf强制覆盖 ceph deploy overwrite conf con
  • C++常用头文件小结

    标准 C include
  • spring cloud 大大大大的坑。 Failed to start bean 'eurekaAutoServiceRegistration'

    先说明一下问题 我在做cloud 消费服务的时候 不是我做的我负责改而已 因我们boot 用的是1 5 4的发行版本 然后 cloud和boot的版本不一样又引入了解决的包 最后被我改回来 导致不能启动 在spring boot 中直接启动
  • 自动创建字符设备驱动的设备文件

    目录 问题描述 解决方案 udev 嵌入式中用的是mdev 相关函数 在调用device create前要先用class create创建一个类 Linux内核中有各种类 比如gpio rtc led等 类这个概念在Linux中被抽象成一种
  • SpringBoot默认包扫描机制及使用@ComponentScan指定扫描路径

    SpringBoot默认包扫描机制 标注了 Component和 Component的衍生注解如 Controller Service Repository就可以把当前的Bean加入到IOC容器中 那么SpringBoot是如何知道要去扫描