Spring Bean 无法被扫描到的问题

问题复现

● 使用如下包结构: 在这里插入图片描述
● 我们发现 HelloWorldController 失效了,无法找到 HelloWorldController 这个 Bean 了。这是为何?

案例分析

● 对于 Spring Boot 而言,关键点在于 Application.java 中使用了 SpringBootApplication 注解。而这个注解继承了另外一些注解,具体定义如下:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
//省略非关键代码
}

● 从定义可以看出,SpringBootApplication 开启了很多功能,其中一个关键功能就是 ComponentScan,参考其配置如下:

@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class)

● 当 Spring Boot 启动时,ComponentScan 的启用意味着会去扫描出所有定义的 Bean,那么扫描什么位置呢?这是由 ComponentScan 注解的 basePackages 属性指定的,具体可参考如下定义:

public @interface ComponentScan {/*** Base packages to scan for annotated components.* <p>{@link #value} is an alias for (and mutually exclusive with) this* attribute.* <p>Use {@link #basePackageClasses} for a type-safe alternative to* String-based package names.*/
@AliasFor("value")
String[] basePackages() default {};
//省略其他非关键代码
}

● 而在我们的案例中,我们直接使用的是 SpringBootApplication 注解定义的 ComponentScan,它的 basePackages 没有指定,所以默认为空(即{})。此时扫描的是什么包?这里不妨带着这个问题去调试下(调试位置参考 ComponentScanAnnotationParser#parse 方法),调试视图如下:
在这里插入图片描述
● 从上图可以看出,当 basePackages 为空时,扫描的包会是 declaringClass 所在的包,在本案例中,declaringClass 就是 Application.class,所以扫描的包其实就是它所在的包,即 com.zp95sky.learn.springlearn.Application
● 如上的包结构 HelloWorldController 已经出了扫描的范围(不和 Application.java 一个包了),这个功能也就失效了。

问题修正

● 解决问题的方式是显式配置 @ComponentScan。

@SpringBootApplication
@ComponentScan("com.zp95sky.learn.springlearn.controller")
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

● 通过上述修改,我们显式指定了扫描的范围为 com.zp95sky.learn.springlearn.controller。不过需要注意的是,显式指定后,默认的扫描范围(即 com.zp95sky.learn.springlearn.application)就不会被添加进去了。另外,我们也可以使用 @ComponentScans 来修复问题,使用方式如下:

@ComponentScans(value = { @ComponentScan(value = "com.zp95sky.learn.springlearn.controller")
})

● 顾名思义,可以看出 ComponentScans 相比较 ComponentScan 多了一个 s,支持多个包的扫描范围指定。

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

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

相关文章

Linux umami网站统计工具自定义API开发

Linux umami网站统计工具自定义API开发 一、src/queries/analytics/下添加调用sql查询文件&#xff1a;二、src/queries/index.js文件中增加导出模块内容&#xff1a;三、src/pages/api/下根据目录添加接口方法文件&#xff1a;四、构建项目&#xff0c;启动。1、到umami目录&a…

PHP 中的魔术常量

概述 PHP提供了9个魔术常数&#xff0c;您可以在PHP应用程序代码中使用。它们是“神奇的”&#xff0c;因为它们是在编译时定义的&#xff0c;不像常规常量&#xff08;您可以自己定义&#xff09;是在运行时定义的。这意味着它们的值可以根据它们在代码中的使用位置而更改。 …

libvirt学习

文章目录 libvirt 简介节点、Hypervisor和域libvirt 安装和配置libvirt的XML配置文件libvirt APIMain libvirt APIsError handlingSpecial specific APIs 建立到Hypervisor的连接libvirt API使用编译libvirt工具virshvirt-clonevirt-dfvirt-imagevirt-installvirt-topvirt-what…

源码分析之Openlayers中MultiPolygon类

概述 在Openlayers中&#xff0c;MultiPolygon类顾名思义就是表示由多个多边形组成的几何对象&#xff0c;关于Polygon类可以参考这篇文章源码分析之Openlayers中Polygon类;同Polygon类一样&#xff0c;MultiPolygon类继承于SimpleGeometry类。 本文主要介绍MultiPolygon类的…

单元测试4.0+思路总结

Jmockit使用笔记_增加代码覆盖率_覆盖try catch_使用new MockUp私有方法-CSDN博客 一般使用new MockUp模拟被测试代码中的私有方法(常用&#xff09; 使用new Expetations模拟被测试代码中的方法?

12.31号 更新的动漫资源!

12.31号 更新的所有动漫资源&#xff08;UC不限速&#xff09; 遮天90集 4K高码率 uc&#xff1a;https://drive.uc.cn/s/3b93ab653cdf4?public1 夸克https://pan.quark.cn/s/cacfbafe5fcc 百度https://pan.baidu.com/s/16BZ0fY5fEvftpmu7tKuXzg?pwdjt5d 一念永恒30集 4…

AIGC与未来的通用人工智能(AGI):从生成内容到智能革命

目录 第一部分&#xff1a;AIGC概述 1.1 什么是生成式人工智能&#xff08;AIGC&#xff09; 1.2 AIGC的应用 第二部分&#xff1a;通用人工智能&#xff08;AGI&#xff09;概述 2.1 什么是通用人工智能&#xff08;AGI&#xff09; 2.2 AGI的关键特征 2.3 当前AGI的挑战 第…

【YashanDB知识库】python驱动查询gbk字符集崖山数据库CLOB字段,数据被驱动截断

本文内容来自YashanDB官网&#xff0c;原文内容请见 https://www.yashandb.com/newsinfo/7849012.html?templateId1718516 【标题】python驱动查询gbk字符集崖山数据库CLOB字段&#xff0c;数据被驱动截断 【关键字】python驱动&#xff0c;gbk服务端&#xff0c;崖山数据库…

自动化测试工具Ranorex Studio(七十八)-故障排除

故障排除 如果你有连接问题&#xff0c;请考虑以下潜在的问题来源&#xff1a; • 请确保被测系统&#xff08;移动设备&#xff09;和运行测试的机器&#xff08;安装Ranorex的&#xff09;是在同一网络中的。 设备上的Wi-Fi设置更改后&#xff0c;请务必重新启动设备。 •…

常用的linux命令介绍

Linux是一个强大的操作系统&#xff0c;它提供了许多命令行工具来帮助用户管理文件和目录、监控系统性能、以及执行各种系统管理任务。下面是一些常用的Linux命令&#xff0c;我会用简单的语言来解释它们的作用&#xff1a; 1. ls • 作用&#xff1a;列出目录内容。 • 比喻&a…

万里数据库GreatSQL监控解析

GreatSQL是MySQL的一个分支&#xff0c;专注于提升MGR&#xff08;MySQL Group Replication&#xff09;的可靠性及性能。乐维监控平台可以有效地监控GreatSQL&#xff0c;帮助用户及时发现并解决潜在的性能问题。 通过在GreatSQL服务器上安装监控代理&#xff0c;收集数据库性…

缓存管理自动化:JuiceFS 企业版 Cache Group Operator 新特性发布

近期&#xff0c;JuiceFS 企业版推出了 Cache Group Operator&#xff0c;用于自动化创建和管理缓存组集群。Operator 是一种简化 Kubernetes 应用管理的工具&#xff0c;它能够自动化应用程序的生命周期管理任务&#xff0c;使部署、扩展和运维更加高效。 在推出 Operator 之前…

Wireshark和科来网络分析系统

Wireshark 是一款功能强大的网络协议分析工具&#xff0c;主要用于捕获和分析网络流量&#xff0c;帮助用户排查网络问题、进行安全分析和学习网络协议。以下是 Wireshark 的基础使用指南&#xff1a; 1. 安装 Wireshark 访问 Wireshark 官网 下载并安装适合你操作系统的版本…

无穿戴动作捕捉系统技术解密及多元化运用

在当今科技飞速发展的时代&#xff0c;动作捕捉技术不断革新&#xff0c;无穿戴动作捕捉系统崭露头角。与传统粘贴标记点的动作捕捉技术相比&#xff0c;无标记点动作捕捉技术具有显著优势。它能够在确保高精度捕捉的前提下&#xff0c;以非接触的方式极大地提升被捕捉对象的表…

wpf 基于Behavior库 的行为模块

Microsoft.Xaml.Behaviors 是一个用于WPF&#xff08;Windows Presentation Foundation&#xff09;的行为库&#xff0c;它的主要作用是允许开发者在不修改控件源代码的情况下&#xff0c;为控件添加自定义的行为和交互逻辑。行为库的核心思想是通过定义可重用的行为组件&…

深度解析PXE技术与实践应用

深度解析PXE技术与实践应用 一、PXE技术概述 1.1 PXE技术定义 PXE&#xff08;Preboot Execution Environment&#xff09;&#xff0c;即预启动执行环境&#xff0c;是一种允许计算机通过网络接口&#xff08;NIC&#xff09;引导启动操作系统的技术。这项技术由Intel和Sys…

GPT分区 使用parted标准分区划分,以及相邻分区扩容

parted 是一个功能强大的命令行工具&#xff0c;用于创建和管理磁盘分区表和分区。它支持多种分区表类型&#xff0c;如 MBR&#xff08;msdos&#xff09;、GPT&#xff08;GUID Partition Table&#xff09;等&#xff0c;并且可以处理大容量磁盘。parted 提供了一个交互式界…

C#如何操作数据库

C#如何操作数据库 前言1、查询操作2、增删改操作3、需要返回id主键的sql语句执行 前言 本文主要交代如何通过引用 using MySql.Data.MySqlClient;来操作数据库 需要导入.dll文件 例如&#xff1a;在本地Mysql下载目录下->Connecter NET 8.0->Assemblies->net5.0->…

DevOps工程技术价值流:Ansible自动化与Semaphore集成

在DevOps的浪潮中&#xff0c;自动化运维工具扮演着举足轻重的角色。Ansible&#xff0c;作为一款新兴的自动化运维工具&#xff0c;凭借其强大的功能和灵活性&#xff0c;在运维领域迅速崭露头角。本文将深入探讨Ansible的特点、架构、工作原理&#xff0c;以及其应用场景&…

2025元旦源码免费送

我们常常在当下感到时间慢&#xff0c;觉得未来遥远&#xff0c;但一旦回头看&#xff0c;时间已经悄然流逝。对于未来&#xff0c;尽管如此&#xff0c;也应该保持一种从容的态度&#xff0c;相信未来仍有许多可能性等待着我们。 免费获取源码。 更多内容敬请期待。如有需要可…