@EntityScan 和 @ComponentScan 的区别

Posted

技术标签:

【中文标题】@EntityScan 和 @ComponentScan 的区别【英文标题】:Difference between @EntityScan and @ComponentScan 【发布时间】:2016-12-18 04:41:59 【问题描述】:

我想了解这里的区别。我看到一个类已经用相同的包示例注释了它们:

@Configuration
@EntityScan("some.known.persistence")
@ComponentScan( "some.known.persistence")
public class ApiConfig 


我了解与 API 文档的区别,但想详细了解。这是否也意味着 @ComponentScan 扫描的任何内容都具有更广泛的 Spring 上下文可见性,而 @EntityScan 没有。如果是这样,使用 @ComponentScan 的某些属性应该足以满足在 JPA 上下文中绑定的需要,不是吗?

【问题讨论】:

参考:Spring Boot org.springframework.boot.autoconfigure.domain.EntityScan 和 Spring org.springframework.context.annotation.ComponentScan 【参考方案1】:

@ComponentScan 注释用于自动为每个使用@Component@Service@Controller@RestController@Repository 注释的类创建 bean,并将它们添加到 Spring 容器中(允许他们成为@Autowired)。

据我所知,另一方面,@EntityScan 不会创建 bean。它仅标识特定持久性上下文应使用哪些类。从 Spring boot 1.4 开始,包括 JPA、MongoDB、neo4j、Cassandra 和 CouchBase。

为什么它们没有合并?好吧,我不是Spring团队的,但是既然它们有不同的含义,为什么要合并它们呢? @EntityScan 应该主要用于扫描你的实体包,而@ComponentScan 应该扫描所有包含 Spring bean 的包,所以很可能出现以下情况:

@ComponentScan("org.example.base")
@EntityScan("org.example.base.entities")
public class MyConfig 


【讨论】:

太棒了。你拯救了我的一天。【参考方案2】:

我们也可以使用@EntityScan来定义一些实体形式的外部jar。

【讨论】:

以上是关于@EntityScan 和 @ComponentScan 的区别的主要内容,如果未能解决你的问题,请参考以下文章

ComponentScan 或 EntityScan 在另一个项目中找不到实体

Spring Boot 1.5.0-snapshot 上的 org.springframework.boot.orm.jpa.EntityScan

从'../components/App'导入应用程序有啥区别;和 var App = require('../components/App');?

5.8 Components — Composing Components(组合组件)

如何使用 Typescript 和 styled-components 创建 ref

NextJS 使用 s-s-r 和 Styled-Components 构建错误