2014-03-31 134 views
2

我正在使用彈簧框架4.指定順序彈簧@Autowired

我有一個類(說ClassA),其中使用了另一個類(說ClassB)。 ClassA的成員變量從ClassB中獲取值。 ClassB具有從屬性文件讀取數據的靜態方法。在ClassB中,已使用@Autowired註釋注入靜態成員變量ApplicationContext

我想要的是,我想確保當ClassA使用它的成員變量時,它應該獲得從屬性文件中讀取的所有值。並且對於該ClassB應該獲得ApplicationContext全部設置爲從MessageSource讀取。因爲ClassA標記爲@Component,Spring加載ClassA,但是當它試圖初始化成員變量時,它變得NullPointerException,因爲ApplicationContext尚未初始化。

所以我的問題是,有沒有什麼辦法可以讓Spring告訴某些bean應該以某種順序或類似的方式初始化。我嘗試使用@DependsOn註釋並將@Bean指定爲ApplicationContext的吸氣器方法。但它給下面的例外:

Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'applicationContext': Requested bean is currently in creation: Is there an unresolvable circular reference?

在這個問題上的任何想法?

感謝

+1

如果您想要從消息源讀取屬性,應該檢出@Value註釋並避免注入整個應用程序上下文。每個類應該有最少的依賴關係 – geoand

回答

3

感謝您的意見。

我在Spring框架提供的其中一個註解中找到了解決方案。

解決方案的@DependsOn註釋工作。實際上,當我在ApplicationContext的上面使用@Bean getter方法時,它正在觸發問題中提到的異常。然後我閱讀@DependsOn註釋的documentation。它聲明這個註解適用於@Bean和@Component。作爲ApplicationContext正在被注入的類,我已經做了ClassA @DependsOn@Component類,其中ApplicationContext被注入並且它工作。

再次感謝您的意見。

1

如果你的目的是使用MessageSource,使用內置的支持,爲解釋here

一般情況下,請勿使用@Autowire靜態字段,請使用@ValuePropertySourcePlaceholderConfigurer作爲屬性。

+0

我試圖以鏈接上提到的方式注入MessageSource。但是它與ApplicationContext的情況相同。 –