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