如果没有@Repository注释,代码可以正常工作,并且使用注释也可以正常工作。有什么不同?

Sam*_*mir 12 java spring jpa spring-data-jpa spring-boot

我们可以通过这种方式声明存储库类

public interface DepartmentRepository extends JpaRepository<Department, Integer>
Run Code Online (Sandbox Code Playgroud)

这样

@Repository
public interface DepartmentRepository extends JpaRepository<Department, Integer>
Run Code Online (Sandbox Code Playgroud)

提到的这两种方法有什么区别。因为如果我们删除@Repository注释,那么代码将正常工作,那么有什么区别,任何人都可以解释一下吗?

Dar*_*the 11

虽然其他答案详细介绍了原型注释,但它们没有记录为什么不需要它,它是 Spring Boot 功能 - 而不是 Spring Framework。

使用 Spring Boot,它将自动扫描主 SpringBootApplication 类中的子包并检测存储库接口,并使用 Autoconfiguration(属于 SpringBootApplication 的一部分)为您创建 Bean。SpringBootApplication

Spring Data 存储库通常从 Repository 或 CrudRepository 接口扩展。如果您使用自动配置,则会从包含主配置类(用 @EnableAutoConfiguration 或 @SpringBootApplication 注解的类)的包中搜索存储库。

https://docs.spring.io/autorepo/docs/spring-boot/current/reference/htmlsingle/#boot-features-spring-data-jpa-repositories

如果您没有使用 Spring Boot,或者存储库不在 Spring Boot 应用程序的包或子包中,则需要对其进行注释并扫描包或创建 bean。

Spring Data 可以创建各种风格的 @Repository 接口的实现。Spring Boot 会为您处理所有这些,只要这些 @Repositories 包含在 @EnableAutoConfiguration 类的同一包(或子包)中。

对于许多应用程序,您所需要做的就是将正确的 Spring Data 依赖项放在类路径上。JPA 有 spring-boot-starter-data-jpa,Mongodb 有 spring-boot-starter-data-mongodb 等。首先,创建一些存储库接口来处理 @Entity 对象。

Spring Boot 尝试根据它找到的 @EnableAutoConfiguration 猜测 @Repository 定义的位置。要获得更多控制,请使用 @EnableJpaRepositories 注释(来自 Spring Data JPA)。

有关此行为的更多信息,请参阅文档,例如对存储库的创建进行更多控制。

https://docs.spring.io/autorepo/docs/spring-boot/current/reference/htmlsingle/#howto-use-spring-data-repositories


小智 0

摘自 spring 文档:

@Repository 注释是任何满足存储库角色或构造型(也称为数据访问对象或 DAO)的类的标记。该标记的用途之一是异常的自动翻译,如异常翻译中所述。

它主要用作构造型标记,但 @Repository 是 @Component 的特化,spring 使用它进行类路径扫描。

https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-stereotype-annotations

https://www.journaldev.com/21460/spring-repository-annotation