Spring 引导中服务接口类的目的



我的问题是关于接口类的使用。我对春天相当陌生,所以如果这太简单,请耐心等待。

首先,当您可以在BoxService中声明查找所有内容时,在这里使用IBoxService接口有什么意义。其次,在控制器中如何使用IBoxService。意思是,我们称之为IBoxService.findAll((。但是,这如何与BoxService类相关联。如果多个服务类实现了 IBoxService 会怎样?这是java的东西还是弹簧注入的东西。谢谢。

package com.xyz.service;
import com.xyz.model.Box;
import java.util.Set;
public interface IBoxService {
Set<Box> findAll();
}
package com.xyz.service;
import com.xyz.model.Box;
import com.xyz.repository.BoxRepository;
import java.util.Set;
import org.springframework.stereotype.Service;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
@Service
@AllArgsConstructor
@Slf4j
@Transactional
public class BoxService implements IBoxService {
@Autowired
private BoxRepository boxRepo;
@Override
public Set<City> findAll() {
return (Set<City>) repository.findAll();
}

}

package com.xyz.controller;
import com.xyz.model.Box;
import com.xyz.service.IBoxService;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;    
@RestController
@RequestMapping("/api/box")
public class BoxController {
@Autowired
private IBoxService boxService;
@GetMapping
public ResponseEntity<Set<Boxes>> allBoxes() {
return (Set<Box>) boxService.findAll();
}
}

创建服务层接口的原因有多种。第一个也是最重要的原因是可测试性。您可以创建服务接口的模拟并轻松测试代码,如果您无法使用模拟库创建模拟,则可以创建测试存根。

另一个原因是,我们可以实现控制器和服务层之间的松散耦合。假设你想完全改变服务的实现,你可以创建新的服务实现,并通过按限定符名称注入新的 Bean 来注入该实现

请了解基本的Java和接口的使用。Spring boot只是Java的抽象,因此所有基本概念都按原样适用。

回到你的问题 IBoxService 是一个接口,允许在控制器级别注入所需的实现。截至目前,只有IBoxServic的实现是BoxService,因此它是自动注入的。如果您有多个实现,则需要使用限定符注释来指定需要注入的实现类型。或者您可以使用类名自己创建对象 bu

请考虑以下事项:

IBoxService由两个类BoxService和TiffinBoxService实现。

现在在控制器中,您可以注入所需的实现。这使我们能够实现隐藏内部细节的界面原则。

在这种情况下,作为控制器的用户不需要知道内部正在使用哪个类,因为我们使用的是接口的引用。

列表接口是将ArrayList和LinkedList作为实现类的最佳示例。

希望有用!!

最新更新