簡體   English   中英

Spring 引導中的服務接口 Class 的用途

[英]Purpose of Service Interface Class in Spring Boot

我的問題是關於接口 class 的使用。 我對 Spring 相當陌生,所以如果這過於簡單,請多多包涵。

首先,當您可以在 BoxService 中聲明 find all 時,這里有一個 IBoxService 接口有什么意義。 其次,在 controller 中如何使用 IBoxService。 意思是,我們正在調用 IBoxService.findAll()。 但是,這如何與 BoxService class 相關聯。 如果多個服務類實現了 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();
}

}

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();
    }
}

創建服務層接口的原因有多種。 第一個也是最重要的原因是可測試性。 您可以創建服務接口的模擬並輕松測試您的代碼,如果您無法使用 mocking 庫創建模擬,那么您可以創建測試存根。

另一個原因是,我們可以實現 Controller 和 Service 層之間的松耦合。 假設您想完全更改服務的實現,您可以創建新的服務實現並通過限定符名稱注入新 bean 來注入該實現

請了解基本的 Java 和接口的使用。 Spring 引導只是對 Java 的抽象,因此所有基本概念都照原樣適用。

回到您的問題 IBoxService 是一個接口,它允許在 controller 級別注入所需的實現。 到目前為止,只有 IBoxServic 的實現是 BoxService,因此它會自動注入。 如果您有多個實現,則需要使用限定符注釋來指定需要注入的實現類型。 或者您可以使用 class 名稱自己創建 object bu

考慮如下:

IBoxService 由兩個類 BoxService 和 TiffinBoxService 實現

現在在 controller 你可以注入你想要的實現。 這使我們能夠實現隱藏內部細節的界面原理。

在這種情況下,用戶是 controller 不需要知道內部使用的是哪個 class,因為我們使用的是接口參考。

列表接口是最好的例子,它有 ArrayList 和 LinkedList 作為實現類。

希望有用!!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM