我在 Java (Spring Boot) 專案中有從 Controller 呼叫的條形碼生成器方法。生成器類如下圖:
@Component
@NoArgsConstructor
public class QRCodeGenerator {
private static final int LABEL_X_POS = 45;
private static final int LABEL_Y_POS = 20;
@Value("${qr-code.margin}")
private int margin;
@Value("${qr-code.fontSize}")
private int fontSize;
public ResponseEntity<Resource> getQRCode(String data) throws IOException {
// code omitted for brevity
addLabel(image, label);
final ByteArrayResource resource = new ByteArrayResource(toByteArray(image));
return ResponseEntity.ok().body(resource);
}
private static byte[] toByteArray(BufferedImage image) throws IOException {
// code omitted for brevity
}
private void addLabel(BufferedImage source, String text) {
int x = LABEL_X_POS;
int y = LABEL_Y_POS;
// code omitted for brevity
}
}
首先我開始使用這個類作為靜態,但后來我洗掉了靜態以application.yml正確讀取資料。
以下是我需要澄清的幾點:
1.我是 Spring 新手,據我所知,spring 服務通常用于提供來自資料庫或任何其他服務、端點等的資料。這是真的嗎?
2.我是否應該為上面的類創建一個服務(我不需要訪問該類中的資料庫)?或者方法更好(創建為組件然后將其注入我的控制器)?
3.關于靜態Util類有很多不同的意見。那么,如何將這個類轉換為靜態 Util 類呢?是比現在更好還是將其用作 Spring Service?
uj5u.com熱心網友回復:
針對您提出的問題,提出幾點意見:
- 用@Service 注釋的類用于業務邏輯層,它可以提供資料,但也可以像您的情況一樣執行操作。
- 基于第 1 點,您可以將其設為服務,因為它提供了為表示層(控制器)創建二維碼的邏輯。
- 將這種類作為 @Component 或更具體的 @Service 可以更容易地使用依賴注入注入依賴項,并且更容易將您的類作為對其他 bean 的依賴項注入,因此也更容易測驗/模擬。將其保留為 Spring Service 是一種更好的方法。
uj5u.com熱心網友回復:
讓它成為一個 spring 服務,當你為控制器撰寫測驗時,你將能夠輕松地用一個模擬來代替它。否則你將無法模擬它(除非你使用 Powernock 之類的東西)。由于您已經向其中注入了值,因此將其保留為 Spring 組件要容易得多。
通常,使用靜態 util 類是一種過早的優化,并且會妨礙測驗。僅當靜態 util 類僅包含沒有副作用、不需要訪問配置資料并且我不介意無法模擬的靜態方法時,我才會使用它們。我在輸入驗證代碼中使用的方法將是我可能使用靜態方法的一個例子。但是您擁有最大的靈活性,例如能夠注入配置,如果您將它們保留為 Spring 組件。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/386333.html
