@ComponentScan
是 Spring 框架中的一个注解,用于指定要扫描的包,以便 Spring 能够发现和注册标有 @Component
注解(以及其他相关注解)的类作为 Spring Bean。如果不使用 @ComponentScan
,Spring 将不会自动扫描和注册这些类作为 Bean。
如果在 @SpringBootApplication
注解中没有指定 scanBasePackages
属性,Spring Boot 会默认扫描主应用程序类所在的包及其子包下的所有组件(@Component
注解的类,包括 @Controller
、@Service
、@Repository
等)。
所以,如果没有显式指定 scanBasePackages
,Spring Boot 将自动扫描主应用程序类所在的包及其子包,注册这些包中标记有 @Component
注解的类作为 Spring Bean。这种默认的扫描机制通常是足够的,尤其是对于小型项目和简单的应用程序。
如果组件类位于 com.xxx
包之外的其他包中,而你没有在 @SpringBootApplication
中指定 scanBasePackages
,那么这些类可能不会被自动扫描和注册为 Spring Bean,除非它们处于主应用程序类所在的包及其子包中。
1. 用法
@ComponentScan
注解可以用在任何带有@Configuration
注解的类上,通常用于Spring配置类中。示例:
@Configuration
@ComponentScan(basePackages = "com.example.package")
public class AppConfig {
// Spring配置类的其他内容
}
2. 参数
basePackages
:指定需要扫描的基础包路径,可以是一个字符串数组,多个包路径以逗号分隔。例如:basePackages = {"com.example.package1", "com.example.package2"}
basePackageClasses
:指定需要扫描的基础包路径,可以直接指定一个或多个类,Spring将会扫描这些类所在的包以及它们的子包。例如:basePackageClasses = {SomeClass1.class, SomeClass2.class}
value
:与basePackages
属性功能相同,用于指定需要扫描的基础包路径。
includeFilters
和excludeFilters
:用于定义包含和排除过滤器,可以通过@Filter
注解的type
属性指定要包含或排除的组件类型,通过classes
属性指定要包含或排除的类。例如:
@ComponentScan(
basePackages = "com.example.package",
includeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyCustomAnnotation.class),
excludeFilters = @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = MyComponent.class))
public class AppConfig {
// Spring配置类的其他内容
}
3. 默认行为
如果没有显式指定basePackages
或basePackageClasses
属性,@ComponentScan
会扫描被注解所在类所在的包及其子包。
4. 注意事项
@ComponentScan
注解不会自动注册Spring Boot的自动配置类(@Configuration
注解的类)和@SpringBootApplication
注解所在类的子包中的组件。这是因为@SpringBootApplication
已经隐含了@ComponentScan
功能。如果扫描到的组件被其他注解修饰(例如
@Primary
、@Qualifier
等),Spring会按照相应的规则进行注入和管理。
评论区