Spring Boot的ComponentScan原理
Spring Boot的ComponentScan原理
@ComponentScan
如果你了解组件扫描,你就会理解Spring。Spring是一个依赖注入框架。它完全是关于依赖的bean和wiring。
定义Spring Beans的第一步是添加正确的注释 - @Component或@Service或@Repository。但是,Spring不知道bean在哪个包下面,除非你告诉它去哪里搜索包。
这部分“告诉Spring到哪里搜索”称为组件扫描。
你必须定义了需要扫描的包,为包定义组件扫描后,Spring将搜索包及其所有子包以获取组件/ bean。
下面展示了如何进行组件扫描的定义:
Spring Boot项目中的组件扫描
如果你的其他包层次结构位于使用@SpringBootApplication标注主应用程序下方,则隐式组件扫描将自动涵盖。也就是说,不要明确标注@ComponentScan,Spring Boot会自动搜索当前应用主入口目录及其下方子目录。
如果其他包中的bean /组件不在当前主包路径下面,,则应手动使用@ComponentScan 添加
如果使用了@ComponentScan ,那么Spring Boot就全部依赖你的定义,如果定义出错,会出现autowired时出错,报a bean of type that could not be found错误,让你很恼火哦。
#######详细示例
考虑下面:
package com.jdon.springboot
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
@SpringBootApplication定义在MyApplication这个类上面,而这个类在包com.jdon.springboot下面。
@SpringBootApplication定义了对包com.jdon.springboot进行自动组件扫描。
如果所有组件都在上述包或其子包中定义,则一切正常。
但是,假设其中一个组件是在包中定义的 com.jdon.springboot2下,在这种情况下,需要将新包添加到组件扫描中。
两个选项
定义@ComponentScan(“com.jdon.springboot2”)
这将扫描com.jdon.springboot2的整个父树。
或者使用数组定义两个特定的组件扫描。
@ComponentScan({“com.jdon.springboot2.abc”,”com.jdon.springboot2.efg”})
与组件扫描相关的错误
No qualifying bean of type found
No qualifying bean of type [com.jdon.springboot.jpa.UserRepository] found for dependency [com.jdon.springboot.jpa.UserRepository]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
或在Intellij Idea中显示 incorrectly saying no beans of type found for autowired repository
上述两个问题的根本原因相同 - 组件未被Spring boot发现。
你需要检查三种可能的情况。尚未添加正确的注释 - @ Controller,@ Repository或@Controller ;尚未添加组件扫描;组件包中未定义所需要的组件包名。
有两个解决选项:1)添加注释或组件扫描2)将组件移动到已在组件扫描下的包中
@Component和@ComponentScan有什么区别?
@Component和@ComponentScan用于不同目的。
@Component表示一个类可能是创建bean的候选者。就像举手一样。
@ComponentScan正在搜索组件包。试图找出谁都举起手来。
<br />
<br />
<br />
<br />
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通