2011-11-08 161 views
1

好吧,這裏是我的使用案例:雞和雞蛋春季豆綁定

我有以下類每個封裝在下一個行的實例。所以:

A - >乙 - 「ç - > d

例如:類A,I具有B類的一個實例,並在類B I對C等等的實例。我試圖將加載\初始化\注入邏輯轉換爲混合彈簧系統。一般的想法是B,C和D需要或多或少地是ApplicationContextAware。我的意思是,他們不會實際實現該接口,而是需要ApplicationContext作爲構造參數。這樣,在混合方法中(開發人員不使用Spring初始化實例),它們必須至少通過ApplicationContext,以便可以連接其他bean。問題是,爲了讓Spring容器加載bean,我現在必須在XML中傳入ApplicationContext。但據我所知,沒有好辦法做到這一點。

我想是這樣的:

public class ApplicationContextPlaceholder implements ApplicationContextAware { 

    private ApplicationContext _applicationContext; 

    public void setApplicationContext(final ApplicationContext applicationContext) throws BeansException { 
     _applicationContext = applicationContext; 
    } 

    public ApplicationContext getApplicationContext() { 
     return _applicationContext; 
    } 

} 

<bean id="a" class="com.company.A"> 
    <constructor-arg> 
     <bean id="applicationContext" class="com.company.ApplicationContextPlaceholder" /> 
    </constructor-arg> 
</bean> 

但顯然這並沒有任何意義,因爲ApplicationContextPlaceholder是不是真的一個ApplicationContext。我也在尋找方法來引用XML中的上下文,但我沒有找到任何東西。

有沒有人知道這種問題的優雅解決方案?

編輯#1:

我在想這件事,我可以有ApplicationContextPlaceholder還實現了ApplicationContext,只是委託注入的情況下,然後將它發生在我身上,也許,只是也許這已經在春天......但據我所知,不。

EDIT#2:

每個類需要一個ApplicationContext的原因是,如果一個開發希望覆蓋類之一在鏈中(比如說,C爲參數的緣故)。在這種情況下,C的子類仍然需要通過Spring加載D.

+0

您是否絕對需要在您的構造函數中使用'ApplicationContext'?如果你不這樣做,你應該可以自動裝載它。 –

+0

是的,每個實例都需要'ApplicationContext'。 – javamonkey79

+0

如果你可以解釋在連續擁有這麼多重量級類(即基本上是ApplicationContextAware)背後的意圖 –

回答

0

ApplicationContextPlaceholder可以讓所有東西都是靜態的。在這種情況下,你不需要傳遞ApplicationContext,當一個API請求一個特定的bean時,你可以檢查它是否爲null,如果是,使用從ApplicationContextPlaceholder加載它。假設基於setter的注入,如果你正在做構造函數的話,你也可以在構造函數中初始化bean。

1

除非某個班級提供額外的管道功能,否則應該避免暴露ApplicationContext。引用Spring參考文獻:in general you should avoid it, because it couples the code to Spring and does not follow the Inversion of Control style

如果您要提供其他功能(例如,可能使用ApplicationContext彙編對象的工廠類),那麼謹慎實施ApplicationContextAware,因爲您的功能已與Spring綁定。

如果你認爲你的dependency injection的替代品,並已決定注入你的bean中的ApplicationContext,您ApplicationContextPlaceholder類(我會留從Placeholder前綴客場避免使用Spring property placeholders混淆)肯定是一個解決方案。 (因爲它是你自己的類,爲什麼不爲額外的功能擴展ApplicationObjectSupport

這個類將需要定義和配置進行初始化,例如:

<bean id="appCtxHolder" class="ApplicationContextHolder" /> 

因爲ApplicationContextHolder實現ApplicationContextAware,春天將初始化時將ApplicationContext注入appCtxHolder。您可以將它用於構造函數注入,如:

<bean id="a" class="com.company.A"> 
    <constructor-arg> 
     <bean factory-bean="appCtxHolder" factory-method="getApplicationContext" /> 
    </constructor-arg> 
</bean> 
+0

這非常值得思考,感謝信息+1。我確實認爲,我需要在課堂上每一個環境下的環境。我意識到這會與Spring產生緊密的耦合,但是,這個特定的項目是Spring和我們業務邏輯的融合,所以考慮到它可能是好的。我會權衡我的選擇並回頭查看,到目前爲止,這是我必須接受的最接近的答案。謝謝! – javamonkey79