簡體   English   中英

Spring外部庫bean初始化順序

[英]Spring external library beans initialization order

我在我的應用程序中遇到了一個問題,不知何故我需要強制一個 bean A 在另一個 bean B 之前初始化。這些 bean 是由外部依賴項(不同的依賴項)提供的,所以我不能簡單地使用@DependsOn注釋來完成。
有沒有可用的解決方案?

我設置了一個簡單的(模塊化的,maven)項目,並且在“外部組件”上使用@DependsOn注釋沒有遇到任何問題。 只需要完成幾件事:

  1. 確保AB的(運行時)類路徑中。
  2. 確保B的應用程序上下文@ComponentScan s(也) A
  3. 找出/猜測的“邏輯bean的名字” A ,在你使用該值@DependsOn注解。 ..then @DependsOn按預期工作(也適用於“外部依賴項”)。

該示例使用 ,但(我確信)配置詳細信息適用於“無引導”環境/上下文。


並考慮 DependsOn 的 javadoc:

在 bean 不通過屬性或構造函數參數顯式依賴另一個 bean,而是依賴另一個 bean 初始化的副作用的情況下,很少使用。

@Autowired會給你同樣的效果(用類似的努力),但類型安全/沒有“名字猜測” - 我將它添加到示例中


返工:關於這個來自第三個項目 (baz),您再次有幾個選項可以在B之前強制A初始化。

  1. 如果AB初始化是微不足道的(例如默認構造函數),您可以像這樣繼續配置/應用程序:

     import ...A; import ...B; ... @Configuration// @SpringBootApplication ..or idempotent public class MyConfig { ... @Bean("a") public A a() { return new A(); } @Bean @DependsOn("a") public B b() { return new B(); } ... }
  2. 如果初始化(A 和 B)不是微不足道的,但您可以參考現有的(外部)配置,那么這有效(重新定義自動裝配的 bean,添加 dependsOn 注釋):

     @Configuration @Import(value = {BConfig.class, AConfig.class}) class MyConfig { @Bean("a") public A a(@Autowired A a) { return a; } @Bean @DependsOn("a") public B b(@Autowired B b) { return b; } }
  3. 您依賴於組件掃描,並重新定義 bean(使用dependsOn):

     @Configuration @ComponentScan(basePackageClasses = {B.class, A.class}) class MyConfig { // same as 2. }
  4. ...

如果外部配置 (2., 3.) 定義了具有相同“名稱” spring.main.allow-bean-definition-overriding ,則spring.main.allow-bean-definition-overriding屬性必須設置為true (在 application.properties 或冪等中)。

暫無
暫無

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

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