Spring Boot中服务接口类的用途

ple*_*sed 2 java model-view-controller spring dependency-injection spring-boot

我的问题是关于接口类的使用。我对 Spring 相当陌生,所以如果这过于简单,请多多包涵。

首先,当您可以在 BoxService 中声明 find all 时,在这里拥有 IBoxService 接口有什么意义。其次,在控制器中如何使用 IBoxService。意思是,我们正在调用 IBoxService.findAll()。但是,这如何与 BoxService 类相关联。如果多个服务类实现了 IBoxService 会怎样?这是一个java的东西还是一个Spring注入的东西。谢谢。

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();
}
Run Code Online (Sandbox Code Playgroud)

}

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Dat*_*are 13

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

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

考虑如下:

IBoxService由两个类BoxService和TiffinBoxService实现

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

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

List 接口是最好的例子,它有 ArrayList 和 LinkedList 作为实现类。

希望有用!!


Gov*_*are 6

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

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