Spring bean创建顺序,将@Configuration与@ImportResource混合

时间:2013-03-04 06:23:11

标签: spring

我通过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无法识别依赖关系并将管理器连接起来。

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

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

1 个答案:

答案 0 :(得分:1)

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