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

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

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

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.olufemithompsonmultibeanconfig0.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]刪除
最新教學 更多>
  • 如何透過內容腳本建立後台腳本與注入腳本的通訊?
    如何透過內容腳本建立後台腳本與注入腳本的通訊?
    將訊息從後台腳本發送到內容腳本,然後發送到注入腳本問題:儘管嘗試將訊息從後台頁面發送到內容腳本,然後發送到注入腳本,但該過程未能按預期工作。內容腳本無法接收來自後台腳本的訊息。 解決方案:此問題是由內容腳本注入的方式引起的。載入擴充功能時,它不會自動將內容腳本注入現有標籤中。僅當建立新選項卡或載入擴...
    程式設計 發佈於2024-11-08
  • 如何解決 PHP 中 file_get_contents() 的 SSL 逾時和加密啟用錯誤?
    如何解決 PHP 中 file_get_contents() 的 SSL 逾時和加密啟用錯誤?
    解決了file_get_contents() 的SSL 逾時和加密啟用錯誤在PHP 中,當使用file_get_contents() 從HTTPS 頁面檢索內容時,可能會遇到與SSL 加密啟用相關的錯誤。此類錯誤之一是:Warning: file_get_contents(): SSL: crypt...
    程式設計 發佈於2024-11-08
  • 如何監控 Guzzle Http 用戶端 – PHP 快速提示
    如何監控 Guzzle Http 用戶端 – PHP 快速提示
    Guzzle 是一款流行的 PHP HTTP 客户端,可以轻松发送 HTTP 请求和创建 Web 服务库。最流行的 PHP 框架提供了内部 Http Client 服务,它们只是 Guzzle Http Client 的定制实现: Laravel Http 客户端 Symfony Http 客户端 ...
    程式設計 發佈於2024-11-08
  • 為什麼 Python 在方法中需要明確的「Self」參數?
    為什麼 Python 在方法中需要明確的「Self」參數?
    揭秘Python方法中的「Self」參數與某些程式語言不同,物件引用是用「this」關鍵字式定義的, Python 要求在方法定義中明確包含「self」參數。這種設計決策提出了一個問題:它是故意的還是實現限制的問題。 在 Python 中,「self」參數明確地建立了方法與其類別實例之間的關係。它提...
    程式設計 發佈於2024-11-08
  • 使用 Gin/Golang 時如何處理空請求主體:綁定與除錯技術指南
    使用 Gin/Golang 時如何處理空請求主體:綁定與除錯技術指南
    Gin/Golang 中請求正文為空使用Gin 處理POST 請求時,偶爾可能會遇到請求正文顯示為空的問題是空的。這可能會令人沮喪,尤其是當您希望從客戶端接收資料時。此問題的一個常見原因是嘗試直接列印正文。 Gin 將請求內文表示為介面類型 ReadCloser。但列印該介面的字串值並不會洩漏實際的...
    程式設計 發佈於2024-11-08
  • Python 列表理解
    Python 列表理解
    Python 最酷的事情之一是清單推導式如何讓在一行程式碼中建立和操作清單變得非常容易。列表理解是一種透過轉換和過濾現有清單中的元素來建立新清單的簡潔方法。這個特性是 Python 使程式碼更具可讀性和高效性的眾多方法之一,對於初學者來說是一個很好的學習工具。在這裡閱讀更多範例...... 奧利佛 ...
    程式設計 發佈於2024-11-08
  • 如何在 Gin 中組織路由:分組路由定義指南?
    如何在 Gin 中組織路由:分組路由定義指南?
    如何在 Gin 中組織路由為了避免路由定義使主文件混亂,您可以將路由分組到單獨的文件中。這種方法可以實現更好的程式碼組織和可維護性。 要建立嵌套路由分組,您可以將路由器變數儲存在結構體或全域變數中。然後,各個檔案可以將處理程序新增至此共用路由器實例。 範例實作routes.gopackage app...
    程式設計 發佈於2024-11-08
  • Leetcode鍊錶問題
    Leetcode鍊錶問題
    反向鍊錶(LeetCode #206) 難度:簡單 概念:迭代與遞歸方法。 合併兩個排序清單 (LeetCode #21) 難度:簡單 概念:鍊錶遍歷與合併技術。 從清單結束時刪除第 N 個節點 **(LeetCode #19) **難度:中等 概念:兩指針技術(慢指針和快指針)。 鍊錶循環...
    程式設計 發佈於2024-11-08
  • 如何在 C++ 容器中儲存異質物件:boost::any 或自訂實作?
    如何在 C++ 容器中儲存異質物件:boost::any 或自訂實作?
    在C 容器中儲存異質物件C 容器通常需要同質元素,這意味著它們只能保存單一類型的對象。但是,在某些情況下,您可能需要一個可以容納混合資料類型的容器。本文探討如何使用 boost::any 函式庫和自訂方法來實現此目的。 使用 boost::anyboost::any 是一個模板類別可以容納任何 C ...
    程式設計 發佈於2024-11-08
  • 使用 Pandas 掌握數據分析:從數據中釋放洞察力
    使用 Pandas 掌握數據分析:從數據中釋放洞察力
    資料分析是資料科學的核心,Python 的 Pandas 函式庫是一個強大的工具,可以讓這項任務變得更輕鬆、更有效率。無論您使用簡單的電子表格還是大型資料集,Pandas 都可以讓您像專業人士一樣靈活地操作、分析和視覺化資料。在本文中,我們將深入探討 Pandas 的基礎知識,涵蓋從資料操作到進階分...
    程式設計 發佈於2024-11-08
  • 使用 GitLab CI/CD 和 Terraform 實作 Lambda 以進行 SFTP 整合、Go 中的 S Databricks
    使用 GitLab CI/CD 和 Terraform 實作 Lambda 以進行 SFTP 整合、Go 中的 S Databricks
    通过 Databricks 中的流程自动化降低成本 我的客户需要降低在 Databricks 上运行的流程的成本。 Databricks 负责的功能之一是从各种 SFTP 收集文件,解压缩它们并将它们放入数据湖中。 自动化数据工作流程是现代数据工程的重要组成部分。在本文中,我们将探...
    程式設計 發佈於2024-11-08
  • 最佳免費開源圖示庫 4
    最佳免費開源圖示庫 4
    In 2024, finding the best free icon library can significantly enhance the visual appeal of your websites, apps, or digital projects. Whether you're a ...
    程式設計 發佈於2024-11-08
  • React Part 元件、State 和 Props 入門
    React Part 元件、State 和 Props 入門
    歡迎回到我們的 React.js 之旅!在上一篇文章中,我們介紹了 React 的基礎知識,強調了它作為建立動態使用者介面的函式庫的優勢。今天,我們將深入探討創建 React 應用程式所需的三個基本概念:元件、狀態和屬性。讓我們詳細探討這些概念! 什麼是 React 元件? Rea...
    程式設計 發佈於2024-11-08
  • 如何利用原生 ES6 Promises 有效地連結異步 jQuery 函數?
    如何利用原生 ES6 Promises 有效地連結異步 jQuery 函數?
    JavaScript 的互通性承諾實現非同步jQuery 函數的高效連結連結異步jQuery 函數時,通常需要避免jQuery 的內建函數Promises 功能並使用原生ES6 Promises 取代。這種互通性允許 jQuery 操作和您想要的 Promise 實現之間的無縫整合。 使用Nativ...
    程式設計 發佈於2024-11-08
  • 在 Python 中使用 ElementTree 的「find」和「findall」方法時如何忽略 XML 命名空間?
    在 Python 中使用 ElementTree 的「find」和「findall」方法時如何忽略 XML 命名空間?
    在ElementTree 的“find”和“findall”方法中忽略XML 命名空間使用ElementTree 模組解析和定位XML 文件中的元素時,命名空間會帶來複雜性。以下介紹如何在 Python 中使用「find」和「findall」方法時忽略命名空間。 當 XML 文件包含命名空間時,會導...
    程式設計 發佈於2024-11-08

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

Copyright© 2022 湘ICP备2022001581号-3