侧边栏壁纸
  • 累计撰写 7 篇文章
  • 累计创建 1 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

@ComponentScan 参数详解:定制化 Spring Bean 扫描

Faithlv
2024-03-04 / 0 评论 / 1 点赞 / 94 阅读 / 2952 字 / 正在检测是否收录...

@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属性功能相同,用于指定需要扫描的基础包路径。

includeFiltersexcludeFilters:用于定义包含和排除过滤器,可以通过@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. 默认行为

如果没有显式指定basePackagesbasePackageClasses属性,@ComponentScan会扫描被注解所在类所在的包及其子包。

4. 注意事项

  • @ComponentScan注解不会自动注册Spring Boot的自动配置类(@Configuration注解的类)和@SpringBootApplication注解所在类的子包中的组件。这是因为@SpringBootApplication已经隐含了@ComponentScan功能。

  • 如果扫描到的组件被其他注解修饰(例如@Primary@Qualifier等),Spring会按照相应的规则进行注入和管理。


1
  • ${post.likes!0}

评论区