Spring Javaconfig bean overiding不考虑添加的@DependsOn
虽然通过扩展原始的@Configuration类覆盖了JavaConfigbean,但我想为新的Bean定义添加一个@DependsOn 然而,这取决于似乎没有被考虑在内。下面是一个重现我的问题的测试用例:Spring Javaconfig bean overiding不考虑添加的@DependsOn,spring,javabeans,Spring,Javabeans,虽然通过扩展原始的@Configuration类覆盖了JavaConfigbean,但我想为新的Bean定义添加一个@DependsOn 然而,这取决于似乎没有被考虑在内。下面是一个重现我的问题的测试用例: public class SpringTest { @Test public void testDependsOnTakenInAccount() { AnnotationConfigApplicationContext ctx2 = new AnnotationConfigApp
public class SpringTest {
@Test
public void testDependsOnTakenInAccount() {
AnnotationConfigApplicationContext ctx2 = new AnnotationConfigApplicationContext(AConfig.class, CConfig.class);
Assert.assertEquals("overriden", ctx2.getBean("bean"));
}
@Configuration
public static class AConfig {
@Bean
public Object bean() {
return "not overriden";
}
}
@Configuration
public static class CConfig extends AConfig {
protected boolean isInitialized = false;
@Bean
public Void doInit() {
isInitialized = true;
return null;
}
@Bean
@DependsOn("doInit")
public Object bean() {
if (!isInitialized) {
throw new RuntimeException("Not initialized");
}
return "overriden";
}
}
}
这是预期的行为吗?如果是,我如何在重写bean的同时添加依赖项?对我来说似乎是一个bug 在配置类中重写
@Bean
工厂方法时,父BeanDefinition
将获胜并在BeanFactory上注册,重写子工厂
因此,不能使用注释配置bean(因为它将被覆盖)
以下测试结果如下:
预期:但是:
我认为问题始于ConfigurationClassParser:
// recursively process the configuration class and its superclass hierarchy
do {
metadata = doProcessConfigurationClass(configClass, metadata);
}
while (metadata != null);
被重写的方法的结果添加到CongurationClass.beanMethods
检查beanMethod是否已从ConfigurationClass.addBeanMethod()中的超类添加,这可能是修复的。
对我来说似乎是一只虫子
在配置类中重写@Bean
工厂方法时,父BeanDefinition
将获胜并在BeanFactory上注册,重写子工厂
因此,不能使用注释配置bean(因为它将被覆盖)
以下测试结果如下:
预期:但是:
我认为问题始于ConfigurationClassParser:
// recursively process the configuration class and its superclass hierarchy
do {
metadata = doProcessConfigurationClass(configClass, metadata);
}
while (metadata != null);
被重写的方法的结果添加到CongurationClass.beanMethods
检查beanMethod是否已从ConfigurationClass.addBeanMethod()中的超类添加,这可能是修复的。
正如Jose Luis Martin所指出的,Spring团队已经确认这是一个bug
我已经解决了这个问题:
@DependsOn("doInit")
@Bean
public Void notOverridingBean() {
return null;
}
@Bean
public Object bean(Object notOverridingBean) {
return "overriden";
}
另一种方法是重写另一个@Configuration类中的bean。正如Jose Luis Martin所指出的,Spring团队已经确认这是一个bug
我已经解决了这个问题:
@DependsOn("doInit")
@Bean
public Void notOverridingBean() {
return null;
}
@Bean
public Object bean(Object notOverridingBean) {
return "overriden";
}
另一种方法是重写另一个@Configuration类中的bean。在一段时间没有注释后,我将发出jira问题,看看是否真的是一个bug。嗨,Jose,我创建了,但没有答案Yet在一段时间没有注释后,我将发出jira问题,看看是否真的是一个bug。嗨,Jose,我创建了,但目前还没有答案