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 的加载会抛出一个NullPointerException因为manager为空。Spring 无法识别依赖关系并将管理器连接起来。

我试图用 annotation 解决这个问题@DependsOn("featureManager"),但后来它抱怨说没有这样的 bean。

所以似乎@Configuration bean 优先于@ImportResource 指令,我不能在两者之间建立依赖关系。那正确吗?

4

1 回答 1

1

枚举值是由 Spring 容器控制之外的类加载器创建的,因此@Autowired管理器字段上的注释被忽略。您可以通过将字段的类型更改为明显错误的类型(例如简单地更改为 Object)来验证这一点,并看到 Spring 上下文被初始化而没有任何问题,这将证明它根本不关心它。

于 2013-03-04T10:41:21.520 回答