」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 使用獨特的配置輕鬆設定多個 Spring Bean

使用獨特的配置輕鬆設定多個 Spring Bean

發佈於2024-11-08
瀏覽:669

Easily Set Up Multiple Spring Beans with Unique Configurations

厭倦了重複的 Spring Bean 註冊?你並不孤單!

是否曾因 Spring Boot 中重複的 bean 定義而陷入困境?你並不孤單!管理具有不同配置的相同類別的多個 bean 可能會變得乏味且混亂。假設您需要這樣的東西:

@Bean
MyService beanA() {
    // Set Configuration for bean A
    Configuration a = new...
    a.setUrl(.....)
    return new MyService(a);
}

@Bean
MyService beanB() {
    // Set Configuration for bean A
    Configuration b = new...
    b.setUrl(.....)
    return new MyService(b);
}

這段程式碼並不複雜,但它很快就會變得重複,特別是在處理多個相同類型的 bean 時。理想情況下,您可以透過不同的設定註冊多個實例,而無需冗餘程式碼。

這與為介面的每個實作擁有唯一的 bean 不同。相反,我們正在討論建立一個具有變化的類別。例如,考慮一個連接到多個資料庫(例如客戶、報告和備份)的應用程式。每個連接都需要自己的配置,這使得管理變得混亂且具有挑戰性。你最終可能會寫出這樣的東西:

@Bean
DatabaseService primaryDatabaseService() {
    return new DatabaseService("db-url-primary");
}

@Bean
DatabaseService reportDatabaseService() {
    return new DatabaseService("db-url-report");
}

擁有更簡單的解決方案可以顯著簡化您的配置,讓您更加關注應用程式邏輯。輸入 MultiBeanConfig — 我建立的一個小型庫,用於幫助管理同一個 Spring bean 的多個配置。

介紹 MultiBeanConfig

MultiBeanConfig 透過單獨的配置簡化了 Bean 的多個實例的設定。有了它,您可以:

  • 減少重複程式碼
  • 集中配置管理
  • 保持程式碼庫整潔有序

核心特點

  • 多 Bean 設定:定義單一類別的多個實例。
  • 自訂配置:透過應用程式屬性控制每個實例的設定。
  • 預設值:如果缺少特定配置,自動套用預設值。
  • 自動注入:輕鬆使用@Autowired進行依賴注入。

逐步指南

1. 將 MultiBeanConfig 加入您的專案中

在 pom.xml 中包含依賴項:


    io.github.olufemithompson
    multibeanconfig
    0.0.3

2. 設定Bean類

使用 @MultiBean 標記您的類,使其符合多個實例的條件:

@MultiBean
public class DatabaseService {
    // Your service logic
}

3. 在設定檔中定義 Bean

在屬性或 YAML 檔案中定義唯一版本:

multibean:
  primary-database-service:
    class: DatabaseService
  report-database-service:
    class: DatabaseService

這會使用預設設定註冊primaryDatabaseService 和reportDatabaseService bean。 MultiBeanConfig 會自動將名稱從短橫線命名法轉換為駝峰命名法。

自訂每個 Bean 的配置

要指派單獨的設置,請將屬性直接加入到每個 bean 的配置中。這是每個實例連接到不同資料庫的範例:

@MultiBean
public class DatabaseService {
   @Value("${database-config.connection-url}")
   private String connectionUrl;
}

設定application.yml中的每個實例:

database-config:
  connection-url: 'jdbc:h2:default-url'

multibean:
  primary-database-service:
    class: DatabaseService
    database-config:
      connection-url: 'jdbc:mysql:primary-db-url'
  report-database-service:
    class: DatabaseService
    database-config:
      connection-url: 'jdbc:postgresql:report-db-url'

此設定為每個 bean 提供了唯一的連線 URL。共享設定也可以在常規部分中定義,從而使配置高效並減少冗餘。

注入配置的替代方法

您不必只依賴 @Value 來注入配置。 Spring的@ConfigurationProperties允許將屬性封裝在配置類別中:

@ConfigurationProperties("database-config")
@Configuration
public class DatabaseConfig {
    private String connectionUrl;
    private int connectionTimeout;
    // Getters and Setters
}

然後,直接注入DatabaseConfig:

@MultiBean
public class DatabaseService {
   private final DatabaseConfig databaseConfig;
   public DatabaseService(DatabaseConfig databaseConfig) {
       this.databaseConfig = databaseConfig;
   }
}

使用配置的 Bean

使用 MultiBeanConfig ,像使用任何 Spring 依賴項一樣注入您獨特配置的 bean:

@Service
public class ApplicationService {
   private final DatabaseService primaryDatabaseService;
   private final DatabaseService reportDatabaseService;

   public ApplicationService(DatabaseService primaryDatabaseService, DatabaseService reportDatabaseService) {
       this.primaryDatabaseService = primaryDatabaseService;
       this.reportDatabaseService = reportDatabaseService;
   }
}

最後的想法

MultiBeanConfig 簡化了 Spring Boot 應用程式中的 bean 管理,特別是在處理功能標誌、資料來源或不同的 API 連線時。它減少了冗餘,保持程式碼整潔,並增強了可維護性。嘗試一下,讓我知道它如何適用於您的專案!

版本聲明 本文轉載於:https://dev.to/thompsonolufemi/easily-set-up-multiple-spring-beans-with-unique-configurations-3df1?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • HTML 格式標籤
    HTML 格式標籤
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    程式設計 發佈於2024-12-26
  • 循環 JavaScript 陣列有哪些不同的方法?
    循環 JavaScript 陣列有哪些不同的方法?
    使用 JavaScript 迴圈遍歷陣列遍歷陣列的元素是 JavaScript 中常見的任務。有多種方法可供選擇,每種方法都有自己的優點和限制。讓我們探討一下這些選項:陣列1。 for-of 遵循(ES2015 )此循環使用迭代器迭代數組的值:const arr = ["a", ...
    程式設計 發佈於2024-12-26
  • 儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    解決PHP 中的POST 請求故障在提供的程式碼片段中:action=''而非:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"檢查$_POST陣列:表單提交後使用 var_dump 檢查 $_POST 陣列的內...
    程式設計 發佈於2024-12-26
  • 如何在 Python 中有效地暫停 Selenium WebDriver 執行?
    如何在 Python 中有效地暫停 Selenium WebDriver 執行?
    Selenium WebDriver 中的等待與條件語句問題: 如何在 Python 中暫停 Selenium WebDriver 執行幾毫秒? 答案:雖然time.sleep() 函數可用於暫停執行指定的秒數,在 Selenium WebDriver 自動化中一般不建議使用。 使用 Seleniu...
    程式設計 發佈於2024-12-26
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1和$array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建構一...
    程式設計 發佈於2024-12-26
  • C++ 賦值運算子應該是虛擬的嗎?
    C++ 賦值運算子應該是虛擬的嗎?
    C 中的虛擬賦值運算子及其必要性雖然賦值運算子可以在C 中定義為虛擬,但這不是強制要求。然而,這種虛擬聲明引發了關於虛擬性的必要性以及其他運算子是否也可以虛擬的問題。 虛擬賦值運算子的案例賦值運算子本質上並非虛擬。然而,當將繼承類別的物件分配給基類變數時,它就變得必要了。這種動態綁定保證了呼叫基於物...
    程式設計 發佈於2024-12-26
  • JavaScript 中的 Let 與 Var:範圍和用法有什麼區別?
    JavaScript 中的 Let 與 Var:範圍和用法有什麼區別?
    JavaScript 中的Let 與Var:揭秘範圍和臨時死區在ECMAScript 6 中引入,let 語句引發了開發人員的語句引發了開發人員的語句引發了開發人員的語句困惑,特別是它與已建立的var 關鍵字有何不同。本文深入研究了這兩個變數聲明之間的細微差別,重點介紹了它們的作用域規則和最佳用例。...
    程式設計 發佈於2024-12-26
  • 如何使用 JavaScript 用逗號分割字串,忽略雙引號內的逗號?
    如何使用 JavaScript 用逗號分割字串,忽略雙引號內的逗號?
    使用JavaScript 用逗號分割字串,忽略雙引號內的逗號解決用逗號分割字串同時保留double 的挑戰-引用段,我們可以在JavaScript 中使用正規表示式。方法如下:var str = 'a, b, c, "d, e, f", g, h'; var arr = str....
    程式設計 發佈於2024-12-26
  • JavaScript 函數表達式中的感嘆號 (!) 有何作用?
    JavaScript 函數表達式中的感嘆號 (!) 有何作用?
    揭示函數表達式中感嘆號的用途在JavaScript 中,執行程式碼時,前面遇到感嘆號(!)函數可能會引發一些問題。讓我們深入研究一下它的功能及其在語法中的作用。 JavaScript 的語法規定,以「function foo() {}」形式宣告的函數是函數聲明,需要呼叫才能執行。然而,預處理帶有感嘆...
    程式設計 發佈於2024-12-26
  • 如何在 Go 中以程式設計方式存取文件組 ID (GID)?
    如何在 Go 中以程式設計方式存取文件組 ID (GID)?
    在Go 中訪問文件組ID (GID)在Go 中,os.Stat() 函數檢索文件信息,包括其系統資訊-特定屬性。此資訊儲存在 syscall.Sys 介面中。雖然列印介面直接顯示 GID,但以程式設計方式存取它會帶來挑戰。 要以 Linux 系統的字串形式取得 GID:file_info, _ :=...
    程式設計 發佈於2024-12-26
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSocke...
    程式設計 發佈於2024-12-26
  • 使用 jpackage 建立 Java 應用程式安裝程序
    使用 jpackage 建立 Java 應用程式安裝程序
    Jpackage,Java 14 中引入的強大工具。在這篇文章中,我將探討如何使用 jpackage 為不同作業系統建立安裝程序,重點是建立 MSI Windows 安裝程序。 jpackage是什麼? jpackage 是一個打包工具,自版本 14 起與 Java 開發工具包 (...
    程式設計 發佈於2024-12-26
  • Spring 的 `@Component`、`@Repository` 和 `@Service` 註解有何不同?
    Spring 的 `@Component`、`@Repository` 和 `@Service` 註解有何不同?
    理解Spring中@Component、@Repository和@Service的區別Spring提供了各種註解來增強組件的組織和功能應用程式中的組件。在這些註解中,@Component、@Repository 和 @Service 扮演著不同的角色,除了作為標記之外還提供特定的功能。 @Compo...
    程式設計 發佈於2024-12-26
  • C++11 何時會自動產生移動建構函式和移動賦值運算子?
    C++11 何時會自動產生移動建構函式和移動賦值運算子?
    移動操作的自動產生在C 11 中,移動語義的引入提出了關於移動構造函數和移動賦值的情況的問題運算子是自動產生的。 在 C 11 下,移動操作不會像複製建構子和複製賦值運算子那樣自動產生。如果滿足某些條件,編譯器僅產生移動語意:不存在使用者定義的複製建構子或複製賦值運算子。 如果明確定義了這些成員中...
    程式設計 發佈於2024-12-26

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3