我通过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指令,我不能在两者之间有依赖关系。是吗?
答案 0 :(得分:1)
枚举值由Spring容器控件之外的类加载器创建,因此忽略管理器字段上的@Autowired
注释。您可以通过将字段的类型更改为明显错误的内容(例如,简单地指向Object)来验证,并且看到Spring上下文被初始化而没有任何问题,这将证明它根本不关心它。