Spring 中的 @EntityScan 和 @ComponentScan 注解

1、概览

在 Spring 应用中,我们通常使用 @EntityScan 来指定实体类所在的包,使用 @ComponentScan 来指定 Bean 组件所在的包。

组件是带有 @Controller@Service@Repository@Component@Bean 等注解的类。实体则是带有 @Entity 注解的类。

本文将带你了解 @EntityScan@ComponentScan 注解在 Spring 中的用法和区别。

2、@EntityScan 注解

在 Spring 中,有 2 种方式放置 @Entity 实体类:

  • 在 main 包或者其子包下
  • 在完全不同的 root 包中

在第一种情况下,可以使用 @EnableAutoConfiguration 来启用 Spring 自动配置 Application Context。

在第二种情况下,需要用 @EntityScan 来告诉 Spring 实体所在的包,如下。

@Configuration
@EntityScan("com.baeldung.demopackage")
public class EntityScanDemo {
    // ...
}

注意,使用 @EntityScan 会禁用 Spring Boot 对实体的自动扫描配置。

3、@ComponentScan 注解

@EntityScan 和实体类似,如果我们希望 Spring 只使用一组特定的 Bean 类,可以使用 @ComponentScan 注解。

该注解可带参数或不带参数使用。如果不带参数,Spring 将扫描当前包及其子包;如果带参数,则只扫描指定的参数的包及其子包。

关于参数,可以提供要扫描的包列表(使用 basePackages 参数),也可以指定具体的类,这些类所属的包也将被扫描(使用 basePackageClasses 参数)。

@ComponentScan 注解的用例如下:

@Configuration
@ComponentScan(
  basePackages = {"com.baeldung.demopackage"}, 
  basePackageClasses = DemoBean.class)
public class ComponentScanExample {
    // ...
}

4、@EntityScan@ComponentScan

说这两个注解的目的完全不同。

@EntityScan 指定要扫描哪些包中的实体类。而 @ComponentScan 用于指定要扫描 Spring Bean 的包。

5、总结

本文介绍了 @EntityScan@ComponentScan 注解的用法,以及它们之间的区别。


Ref:https://www.baeldung.com/spring-entityscan-vs-componentscan