2

一部の構成をXMLを介してシステムデプロイヤーに公開し、残りを構成Beanに保持しています。

一部の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をロードすると、がnullであるNullPointerExceptionためにがスローされます。managerSpringは依存関係を識別して、マネージャーを接続することができませんでした。

アノテーションでこれを修正しようとしました@DependsOn("featureManager")が、そのようなBeanがないと文句を言います。

したがって、@ Configuration Beanは@ImportResourceディレクティブよりも優先されるようで、2つの間に依存関係を持つことはできません。そうですか?

4

1 に答える 1

1

列挙値は、Springコンテナーの制御外でクラスローダーによって作成されるため@Autowired、マネージャーフィールドのアノテーションは無視されます。フィールドのタイプを明らかに間違ったもの(たとえば、単にObject)に変更することで確認でき、Springコンテキストが問題なく初期化されていることを確認できます。これは、フィールドがまったく気にしないことを証明します。

于 2013-03-04T10:41:21.520 に答える