2013-03-04 85 views
2

我將一些配置通過XML公開給系統部署人員,其餘部分保留在配置bean中。Spring bean創建順序,將@Configuration與@ImportResource混合

我的一些bean依賴於來自XML文件的bean。但是,Spring似乎無法解決這種依賴關係。

主要配置類:

@Configuration 
@Import({FeatureTogglesConfig.class, LanguagesConfig.class ... } 

的FeatureTogglesConfig類:

@Configuration 
@ImportResource(value = "classpath*:**/features-config.xml") 
public class FeatureTogglesConfig { 

} 

這讀取XML文件來創建...:

<bean id="featureManager" class="toggles.FeatureManager"> 
    <constructor-arg> 
     <set value-type="toggles.Feature"> 
      <value>FAKE_LANGUAGES</value> 
     </set> 
    </constructor-arg> 
</bean> 

FAKE_LANGUAGES是一個枚舉值。它需要的FeatureManager作爲自動連接:

public enum Feature { 

    FAKE_LANGUAGES; 

    @Autowired 
    private FeatureManager manager; 

    public boolean isActive() { 
     return manager.isActive(this); 
    } 

的LanguagesConfig使用枚舉在需要的功能,管理者已經設置的方式:

@Bean(name = "fake-latin-language-group") 
public FakeLatinLanguageGroup fakeLatinLanguageGroup() { 
    return if FAKE_LANGUAGES.isActive() ? new FakeLatinLanguageGroup() : ... ; 
} 

然而,LanguagesConfig的裝載拋出一個NullPointerException因爲manager一片空白。 Spring一直無法確定依賴關係並將管理人員連接起來。

我試圖用註釋@DependsOn("featureManager")來解決這個問題,但它後來抱怨說沒有這樣的bean。

所以看起來@Configuration bean優先於@ImportResource指令,我不能在兩者之間有依賴關係。是對的嗎?

回答

1

枚舉值由Spring容器控制之外的類加載器創建,因此忽略管理器字段中的@Autowired註釋。您可以通過將字段的類型更改爲明顯錯誤的東西(例如簡單地轉換爲Object)來驗證,並且看到正在初始化的Spring上下文沒有任何問題,這將證明它根本不關心它。

+0

是的,你是對的!在發佈我的問題後我很快意識到這一點。 – Synesso 2013-03-04 20:08:13