Spring Javaconfig bean overiding不考虑添加的@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

虽然通过扩展原始的@Configuration类覆盖了JavaConfigbean,但我想为新的Bean定义添加一个@DependsOn

然而,这取决于似乎没有被考虑在内。下面是一个重现我的问题的测试用例:

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,我创建了,但目前还没有答案