Java接口 - CrudRepository

问题描述 投票:0回答:2

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

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

关于我使用来自saveCarRepository方法,我完全迷失了,因为我不知道,它是如何将传递的对象真正保存到数据库中的。原因是,这个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;

}


}
}

请问你们能澄清一下,这个方法怎么可能将汽车对象保存到配置到弹簧的任何数据库?因为没有save方法,所以它怎么知道怎么做?

java spring
2个回答
2
投票

通常,为了能够在Java应用程序中使用接口,您还需要至少一个实现接口的非抽象类 - 否则在调用方法时确实无需执行任何操作。

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

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

这种工作方式非常强大,这也是Spring Data如此优秀的原因。您不必自己编写用于处理数据库的所有繁琐代码 - 您只需定义一个接口,指定您想要从数据库中获取什么,Spring Data将自动为您生成所有代码。


2
投票

它是Spring Data提供的功能。在引擎盖下,Spring将确定您尝试使用哪个数据库。假设您正在使用SQL数据库PostgreSQL。 Spring确定它应该使用适当的接口JpaRepository。然后,Spring Data JPA是众多Spring Data子模块之一,它将为JpaRepository提供基本实现。

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

List<Car> findByName(String name);

这将通过参数Car检索所有names,但不是

List<Car> pleaseGiveAllCarsWithName(String name);

有关方法命名约定,请参阅documentation

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

© www.soinside.com 2019 - 2024. All rights reserved.