Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.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接口-Crudepository_Java_Spring - Fatal编程技术网

Java接口-Crudepository

Java接口-Crudepository,java,spring,Java,Spring,我试图真正理解Java中这些接口是如何工作的。 据我所知,它有点用来描述实现类将做什么,而不是如何做。这对我来说已经足够清楚了 问题是,当我尝试使用Spring数据包中的Crudepository接口时,我真的不知道它是如何工作的。 例如,我创建了CarRepository,它扩展了crudepository接口,而不添加任何新方法。 在此之后,我创建了CarService类,该类通过CarService构造函数注入CarRepository以进行依赖项注入 关于这一点,我使用了CarRepos

我试图真正理解Java中这些接口是如何工作的。 据我所知,它有点用来描述实现类将做什么,而不是如何做。这对我来说已经足够清楚了

问题是,当我尝试使用Spring数据包中的Crudepository接口时,我真的不知道它是如何工作的。 例如,我创建了CarRepository,它扩展了crudepository接口,而不添加任何新方法。 在此之后,我创建了CarService类,该类通过CarService构造函数注入CarRepository以进行依赖项注入

关于这一点,我使用了CarRepository中的save方法,我完全不知所措,因为我不知道它是如何将传递的对象保存到数据库的。原因是,这个save方法没有“body”,所以它如何知道如何插入数据库

代码示例如下:

class CarService{
     private CarRepository carRepository;
     public CarService(CarRepository carRepository){
           this.carRepository = carRepository;}

     public Car saveCar(Car car){
     Car savedCar = carRepository.save(car);
     return savedCar;

}


}
}

你们能澄清一下吗,这个方法怎么可能将car对象保存到配置为spring的任何数据库中?因为没有save方法的主体,所以它如何知道如何做到这一点呢?

这是Spring数据提供的功能。在引擎盖下,Spring将确定您要使用的数据库。假设您正在使用SQL数据库PostgreSQL。Spring确定它应该使用适当的接口JpaRepository。然后,Spring数据子模块中的Spring数据JPA将为JPA提供基本的实现

Spring还能够动态地为您在CarRepository中声明的任何自定义查询提供实现。但是,要使其工作,声明的方法需要遵循特定的命名约定。例如,Spring能够理解该方法

List<Car> findByName(String name);
有关方法命名约定,请参阅


正是由于Spring提供了这些实现,诸如save之类的基本方法以及诸如findByName之类的自定义查询都可以开箱即用。

这是Spring数据提供的功能。在引擎盖下,Spring将确定您要使用的数据库。假设您正在使用SQL数据库PostgreSQL。Spring确定它应该使用适当的接口JpaRepository。然后,Spring数据子模块中的Spring数据JPA将为JPA提供基本的实现

Spring还能够动态地为您在CarRepository中声明的任何自定义查询提供实现。但是,要使其工作,声明的方法需要遵循特定的命名约定。例如,Spring能够理解该方法

List<Car> findByName(String name);
有关方法命名约定,请参阅


正是由于Spring提供了这些实现,基本方法(如save)以及自定义查询(如findByName)都可以开箱即用。

通常,为了能够在Java应用程序中使用接口,您还需要至少一个实现该接口的非抽象类,否则在调用方法时实际上没有什么可执行的

Spring数据与接口的工作方式与普通Java程序不同。它查看存储库接口,然后在运行程序时自动生成一个实现该接口的类。当您在存储库接口上调用方法时,实际执行的是自动生成的类中的代码

你永远看不到实际的类,因为它是在你运行程序时动态生成的——在你编写和编译代码时它还不存在


这种工作方式非常强大,正是这种方式使Spring数据非常适合使用。您不必自己编写所有繁琐的数据库代码-您只需定义一个接口,指定您希望从数据库中获得的内容,Spring Data将自动为您生成所有代码。

通常,为了能够在Java应用程序中使用接口,您还需要至少一个实现该接口的非抽象类,否则在调用方法时实际上没有什么可执行的

Spring数据与接口的工作方式与普通Java程序不同。它查看存储库接口,然后在运行程序时自动生成一个实现该接口的类。当您在存储库接口上调用方法时,实际执行的是自动生成的类中的代码

你永远看不到实际的类,因为它是在你运行程序时动态生成的——在你编写和编译代码时它还不存在

这种工作方式非常强大,正是这种方式使Spring数据非常适合使用。您不必自己编写所有用于处理数据库的繁琐代码,只需定义一个接口,该接口指定您需要的具体内容
如果您想退出数据库,Spring数据将自动为您生成所有代码。

这与Java中接口的工作方式无关。这是关于spring在幕后所做的魔术。DataAlway:如果你不知道接口是如何工作的,不要使用框架,而是学习基础知识。从描述上看,听起来spring好像在运行时从你的CRUD接口创建一个类?尝试记录或打印carRepository.getClass.getName的值;它可能类似于CGLib$something或Javassist$something,表明它们是通过CGLib或Javassist动态创建的。这与Java中接口的工作方式无关。这是关于spring在幕后所做的魔术。DataAlway:如果你不知道接口是如何工作的,不要使用框架,而是学习基础知识。从描述上看,听起来spring好像在运行时从你的CRUD接口创建一个类?尝试记录或打印carRepository.getClass.getName的值;它可能类似于CGLib$something或Javassist$something,表示它们是通过CGLib或Javassist.ok动态创建的。所以,如果我向CarRepository声明任何附加方法,而该方法没有覆盖CrudePository接口中的任何方法,那么我猜它不会被所有Spring特性管理?例如,我将向CarRepository添加一个方法:公共字符串showCarBrandCar;所以它不知道该怎么办?@MaciejPapurzyński是的,确实不能向存储库接口添加任意方法,因为Spring数据不知道如何为这些方法生成实现。该方法必须有一个特定的签名,看看Spring数据能理解哪个。更新了我的答案,以包含@JesperAlright提供的自定义查询主题和文档链接。所以,如果我向CarRepository声明任何附加方法,而该方法没有覆盖CrudePository接口中的任何方法,那么我猜它不会被所有Spring特性管理?例如,我将向CarRepository添加一个方法:公共字符串showCarBrandCar;所以它不知道该怎么办?@MaciejPapurzyński是的,确实不能向存储库接口添加任意方法,因为Spring数据不知道如何为这些方法生成实现。该方法必须有一个特定的签名,看看Spring数据能理解哪个。更新了我的答案,以包含@Jesper提供的自定义查询主题和文档链接