厭倦了重複的 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 透過單獨的配置簡化了 Bean 的多個實例的設定。有了它,您可以:
在 pom.xml 中包含依賴項:
io.github.olufemithompson multibeanconfig 0.0.3
使用 @MultiBean 標記您的類,使其符合多個實例的條件:
@MultiBean public class DatabaseService { // Your service logic }
在屬性或 YAML 檔案中定義唯一版本:
multibean: primary-database-service: class: DatabaseService report-database-service: class: DatabaseService
這會使用預設設定註冊primaryDatabaseService 和reportDatabaseService bean。 MultiBeanConfig 會自動將名稱從短橫線命名法轉換為駝峰命名法。
要指派單獨的設置,請將屬性直接加入到每個 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; } }
使用 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 連線時。它減少了冗餘,保持程式碼整潔,並增強了可維護性。嘗試一下,讓我知道它如何適用於您的專案!
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3