![](/img/trans.png)
[英]Forcing external java (jar project) library beans to be managed by Spring fabric
[英]Spring external library beans initialization order
我在我的應用程序中遇到了一個問題,不知何故我需要強制一個 bean A 在另一個 bean B 之前初始化。這些 bean 是由外部依賴項(不同的依賴項)提供的,所以我不能簡單地使用@DependsOn
注釋來完成。
有沒有可用的解決方案?
我設置了一個簡單的(模塊化的,maven)項目,並且在“外部組件”上使用@DependsOn
注釋沒有遇到任何問題。 只需要完成幾件事:
A
在B
的(運行時)類路徑中。B
的應用程序上下文@ComponentScan
s(也) A
。A
,在你使用該值@DependsOn
注解。 ..then @DependsOn
按預期工作(也適用於“外部依賴項”)。該示例使用spring-boot ,但(我確信)配置詳細信息適用於“無引導”環境/上下文。
並考慮 DependsOn 的 javadoc:
在 bean 不通過屬性或構造函數參數顯式依賴另一個 bean,而是依賴另一個 bean 初始化的副作用的情況下,很少使用。
@Autowired
會給你同樣的效果(用類似的努力),但類型安全/沒有“名字猜測” - 我將它添加到示例中。
返工:關於這個來自第三個項目 (baz),您再次有幾個選項可以在B
之前強制A
初始化。
如果A
和B
初始化是微不足道的(例如默認構造函數),您可以像這樣繼續配置/應用程序:
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(); } ... }
如果初始化(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; } }
您依賴於組件掃描,並重新定義 bean(使用dependsOn):
@Configuration @ComponentScan(basePackageClasses = {B.class, A.class}) class MyConfig { // same as 2. }
如果外部配置 (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.