Spring Boot,注解,@ComponentScan

@ComponentScan 是 Spring 框架中一个核心注解,用于启用组件扫描。


@ComponentScan 核心知识点 🔍

  • 作用 : @ComponentScan 指示 Spring 在哪些包(packages)中查找带有特定注解的类(例如 @Component, @Service, @Repository, @Controller, @Configuration 等),并将它们自动注册为 Spring IoC 容器中的 Bean。
  • 默认行为 : 如果不指定任何参数,@ComponentScan 会扫描与声明该注解的配置类(通常是带有 @Configuration 注解的类)相同的包及其所有子包
  • 常用参数 :
    • valuebasePackages: 一个字符串数组,用于显式指定要扫描的一个或多个基础包。例如:@ComponentScan(basePackages = "com.example.myapp")@ComponentScan(value = {"com.example.service", "com.example.repository"})
    • basePackageClasses: 一个 Class 数组,Spring 会扫描这些类所在的包及其子包。这是一种类型安全的方式来指定基础包,可以避免因包名字符串拼写错误导致的问题。例如:@ComponentScan(basePackageClasses = {UserService.class, ProductRepository.class})
    • includeFilters: 定义哪些类型的组件应该被包含在扫描中。可以基于注解、类类型、AspectJ 表达式等进行过滤。需要与 useDefaultFilters = false 配合使用,或者在默认过滤器基础上添加。
    • excludeFilters: 定义哪些类型的组件应该被排除在扫描之外。过滤规则与 includeFilters 类似。
    • useDefaultFilters: 布尔值,默认为 true。当为 true 时,Spring 会扫描所有用 @Component, @Service, @Repository, @Controller, @Configuration 等标准注解标记的类。如果只想使用自定义的 includeFilters,应将其设置为 false
  • @SpringBootApplication 的关系 : 在 Spring Boot 应用中,@SpringBootApplication 注解实际上是一个组合注解,它包含了 @ComponentScan (以及 @EnableAutoConfiguration@SpringBootConfiguration)。因此,通常在 Spring Boot 应用的主类上使用 @SpringBootApplication 就已经启用了组件扫描,默认扫描主类所在的包及其子包。
  • 自定义扫描规则 : 通过 includeFiltersexcludeFilters,可以非常灵活地定制组件扫描的规则。例如,可以只扫描带有特定自定义注解的组件,或者排除某些特定的组件。
    • Filter 类型 (FilterType) 包括:ANNOTATION, ASSIGNABLE_TYPE, ASPECTJ, REGEX, CUSTOM
  • 性能考量 : 扫描的包范围越广,应用程序启动时扫描所需的时间就越长。因此,建议将 basePackagesbasePackageClasses 配置得尽可能精确,只扫描必要的包。
  • 重复扫描 : 避免在多个 @Configuration 类中配置重叠的扫描范围,这可能导致不必要的重复扫描或意外的 Bean 覆盖(尽管 Spring 通常能处理 Bean 定义的覆盖)。
  • 模块化应用 : 在大型或模块化应用中,每个模块可能在其自己的 @Configuration 类中使用 @ComponentScan 来扫描模块内部的组件,有助于保持模块的内聚性。

@ComponentScan 是实现 Spring 依赖注入和控制反转(IoC)的关键机制之一,它使得开发者可以方便地通过注解声明组件,而无需在 XML 配置文件中显式定义每一个 Bean。

相关推荐
YOU OU2 小时前
Redis基础常识与命令
数据库·redis·缓存
腻害兔2 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社3 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
萧瑟余晖4 小时前
JDK 26 新特性详解
java·开发语言
Database_Cool_4 小时前
OLTP 和 OLAP 区别详解:分析型数据库和事务型数据库怎么选(附阿里云 AnalyticDB MySQL 选型指南)
数据库·mysql·阿里云
爱写代码的阿森5 小时前
鸿蒙三方库 | harmony-utils之KvUtil键值型数据库操作详解
数据库·华为·harmonyos·鸿蒙·huawei
马优晨5 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
Database_Cool_5 小时前
单机 MySQL 迁移到分布式数据库方便吗?阿里云 PolarDB-X 100% MySQL 协议兼容零改造平滑迁移
数据库·分布式·mysql
姜太小白6 小时前
【MySQL】 索引优化实战:解决 WHERE 等值 + IS NULL 查询,TEXT 字段报错 1167 的完整指南
数据库·mysql