Spring Boot,注解,@ComponentScan
@ComponentScan
是 Spring 框架中一个核心注解,用于启用组件扫描。
@ComponentScan 核心知识点 🔍
- 作用:
@ComponentScan
指示 Spring 在哪些包(packages)中查找带有特定注解的类(例如@Component
,@Service
,@Repository
,@Controller
,@Configuration
等),并将它们自动注册为 Spring IoC 容器中的 Bean。 - 默认行为: 如果不指定任何参数,
@ComponentScan
会扫描与声明该注解的配置类(通常是带有@Configuration
注解的类)相同的包及其所有子包。 - 常用参数:
value
或basePackages
: 一个字符串数组,用于显式指定要扫描的一个或多个基础包。例如:@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
就已经启用了组件扫描,默认扫描主类所在的包及其子包。 - 自定义扫描规则: 通过
includeFilters
和excludeFilters
,可以非常灵活地定制组件扫描的规则。例如,可以只扫描带有特定自定义注解的组件,或者排除某些特定的组件。- Filter 类型 (
FilterType
) 包括:ANNOTATION
,ASSIGNABLE_TYPE
,ASPECTJ
,REGEX
,CUSTOM
。
- Filter 类型 (
- 性能考量: 扫描的包范围越广,应用程序启动时扫描所需的时间就越长。因此,建议将
basePackages
或basePackageClasses
配置得尽可能精确,只扫描必要的包。 - 重复扫描: 避免在多个
@Configuration
类中配置重叠的扫描范围,这可能导致不必要的重复扫描或意外的 Bean 覆盖(尽管 Spring 通常能处理 Bean 定义的覆盖)。 - 模块化应用: 在大型或模块化应用中,每个模块可能在其自己的
@Configuration
类中使用@ComponentScan
来扫描模块内部的组件,有助于保持模块的内聚性。
@ComponentScan
是实现 Spring 依赖注入和控制反转(IoC)的关键机制之一,它使得开发者可以方便地通过注解声明组件,而无需在 XML 配置文件中显式定义每一个 Bean。