簡體   English   中英

如何告訴Spring實例化選定的bean,而不提供構造函數args?

[英]How to tell Spring to instantiate selected beans without providing constructor args?

問題:

我正在與另一個團隊編寫的庫集成。 這個庫提供了我在Spring驅動的應用程序中使用的一組類。 我的應用程序中的每個bean都在單例范圍內。

該庫中的類也有99%使用構造函數注入。

我使用的是XML,其配置與以下內容非常相似:

<bean id="lib.service1" class="lib.Service1"/>
<bean id="lib.service2" class="lib.Service2">
 <constructor-arg ref="lib.service1"/>
</bean>
<bean id="lib.service3" class="lib.Service3">
 <constructor-arg ref="lib.service1"/>
</bean>
<bean id="lib.service4" class="lib.Service3">
 <constructor-arg ref="lib.service2"/>
 <constructor-arg ref="lib.service3"/>
</bean>
<!-- other bean definitions -->
<bean id="lib.serviceN" class="lib.ServiceN">
 <constructor-arg ref="lib.serviceX"/>
 <constructor-arg ref="lib.serviceY"/>
 <constructor-arg ref="lib.serviceZ"/>
 <constructor-arg ref="lib.serviceK"/>
</bean>
<!-- other bean definitions -->

我想要的是:

我想簡化配置以不使用bean ID,並要求spring根據bean構造函數中的參數類型為我做構造函數注入。 我還可以要求庫實現者將@Inject批注添加到類構造函數中(99%的類只有一個公共構造函數),但這就是我可以要求對其庫進行重構的全部內容。

最后,我想在我的spring配置中添加以下內容(不起作用,但說明了這個想法):

<bean class="lib.Service1"/>
<bean class="lib.Service2"/>
<bean class="lib.Service3"/>
<!-- ... -->
<bean class="lib.ServiceN"/>

在這里,我期望Spring能夠確定我想對所有這些bean使用構造函數注入,並根據構造函數參數類型來推斷bean實例。

請注意, 我不能使用組件掃描 -它們有一個包(在上面給出的示例中為lib),並且該包中的某些類對我的應用程序無用,而且過於昂貴,無法不必要地創建。 再加上一些我不使用的類是實驗性的,可以更改/重命名/刪除這些類而無需事先通知。

添加autowire="constructor" ,假設這些bean類型只有一個構造函數,並且相應的參數與單個bean匹配。

<bean class="lib.Service1" autowire="constructor"/>

從文檔中

  1. "constructor"

類似於"byType"的構造函數參數。 如果在bean工廠中不存在一個構造函數參數類型的bean,則會引發致命錯誤。 請注意,顯式依賴關系(即"property""constructor-arg"元素)始終會覆蓋自動裝配。 注意:該屬性不會被子bean定義繼承。 因此,需要根據具體的bean定義進行指定。

暫無
暫無

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

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