【问题标题】:Spring bean creation order, mixing @Configuration with @ImportResourceSpring bean 创建顺序,混合@Configuration 和@ImportResource
【发布时间】:2013-03-04 06:23:10
【问题描述】:

我通过 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 指令,我不能在两者之间建立依赖关系。对吗?

【问题讨论】:

    标签: spring


    【解决方案1】:

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

    【讨论】:

    • 是的,你是对的!我在发布我的问题后不久就意识到了这一点。
    猜你喜欢
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多