Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果没有@Repository注释,代码可以正常工作,而使用注释也可以正常工作。有什么区别?_Java_Spring_Spring Boot_Jpa_Spring Data Jpa - Fatal编程技术网

Java 如果没有@Repository注释,代码可以正常工作,而使用注释也可以正常工作。有什么区别?

Java 如果没有@Repository注释,代码可以正常工作,而使用注释也可以正常工作。有什么区别?,java,spring,spring-boot,jpa,spring-data-jpa,Java,Spring,Spring Boot,Jpa,Spring Data Jpa,我们可以用这种方式声明存储库类 public interface DepartmentRepository extends JpaRepository<Department, Integer> public interface DepartmentRepository扩展了JpaRepository 这边 @Repository public interface DepartmentRepository extends JpaRepository<Department, I

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

public interface DepartmentRepository extends JpaRepository<Department, Integer>
public interface DepartmentRepository扩展了JpaRepository
这边

@Repository
public interface DepartmentRepository extends JpaRepository<Department, Integer>
@存储库
公共接口DepartmentRepository扩展了JpaRepository

这两种方法的区别是什么。因为如果我们删除
@Repository
注释,那么代码将正常工作,那么有什么区别,有人能解释一下吗。

摘自spring文档:

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

它主要作为一个原型标记,但@Repository是@Component的一个特化,spring将其用于类路径扫描


@Repository
注释用于指示类为对象的存储、检索、搜索、更新和删除操作提供机制

SpringRepository注释是@Component注释的特化,因此Spring框架通过类路径扫描自动检测Spring存储库类


@Repository用于创建Bean。如果您不使用此注释,那么您可以通过其他方式创建bean,因此,它对您没有任何影响。

@Repository
是一种特殊类型的
@组件
,我们使用
@Repository
注释作为存储库的接口
@Repository
处理捕获与数据持久性相关的异常


扩展
JpaRepository
时,我们不需要使用
@Repository
注释,因为Spring检测到预定义的
JpaRepository
已被扩展,并将扩展
JpaRepository
的接口识别为存储库。

而其他答案则详细介绍了立体类型注释他们没有记录为什么不需要它,它是一个Spring引导特性,而不是Spring框架

使用SpringBoot,它将自动扫描主SpringBootApplication类中的子包,检测存储库接口,并使用SpringBootApplication中的自动配置为您创建bean

Spring数据存储库通常从存储库或Crudepository接口扩展而来。如果使用自动配置,将从包含主配置类(用@EnableAutoConfiguration或@springbootplication注释的配置类)的包中搜索存储库

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

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

对于许多应用程序,只需将正确的Spring数据依赖项放在类路径上。有一个spring启动程序数据jpa for jpa,spring启动程序数据mongodb for mongodb,等等。要开始,请创建一些存储库接口来处理@Entity对象

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

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


没有
@Repository
在接口上不起任何作用,Spring Data有其他检测bean的方法。这并不能解释为什么不需要它。这取决于您的设置,如果您有组件或服务与Repository组合,那么您就不需要定义它,但是为了让springs自动连接工作,您需要有三个注释中的一个,因为这些注释为您创建bean。如果您的应用程序中有另一种机制从JpaRepository实现接口创建bean,那么当然,它在没有注释的情况下也可以工作,否则您应该在构建时遇到“bean找不到”错误。这是由于Spring boot选择了接口。您有没有尝试过这种方法?因为你错了。我不知道您是如何理解spring boot文档中的这些行的,但是界面上的
@Repository
对于spring boot来说意味着零,它可以在同一个包(或子包)或完全不相关的包(带有
@ComponentScan
@EnableJpaRepositories
)中找到它。再次强调:如果你把
@Repository
放在一个界面上并不重要。我不确定我是否理解你的评论,我相信这就是我所说的。如果你没有使用Spring Boot,或者存储库在一个子包中,那么需要对它进行注释,并扫描包我现在不理解你的编辑,因为您留下了一个奇怪的文件,或者存储库不在包中,所以这种方式是没有意义的。但无论如何,这仍然是错误的。对!界面上的
@Repository
是不需要的,永远:)