为什么 Spring @Configuration 类继承不能按预期工作?

Ste*_*ers 6 java inheritance spring dependency-injection component-scan

我有一个抽象的 Spring 配置类,其中包含一个公共 bean:

public abstract class AbstractConfig {
    @Bean
    public CommonBean commonBean {
        CommonBean commonBean = new CommonBean();
        commonBean.specifics = getSpecifics();
    };

    public abstract String getSpecifics();
}
Run Code Online (Sandbox Code Playgroud)

普通 bean 的细节由其子类设置:

package realPackage;
@Configuration
public class RealConfig extends AbstractConfig {
    @Override
    public String getSpecifics() {
        return "real";
    }
}
Run Code Online (Sandbox Code Playgroud)

...和...

package testPackage;
@Configuration
@ComponentScan(basePackages = {"testPackage", "realPackage" })
public class TestConfig extends AbstractConfig {
    @Override
    public String getSpecifics() {
        return "test";
    }
}
Run Code Online (Sandbox Code Playgroud)

我的测试只需要使用TestConfig并且不应该知道RealConfig(但确实需要访问中的其他组件realPackage)。它始于:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestConfig.class)
public class MyIntegrationTestIT { //... }
Run Code Online (Sandbox Code Playgroud)

通过上面的代码,这可以按预期工作并使用"test"具体细节。但是,如果我颠倒 中包的顺序@ComponentScan"real"则会使用具体信息。这让我感到困惑 - 我指定了所以TestConfig肯定应该调用此重写方法?谁能告诉我们Spring这样做的原因以及如何解决这个问题?

Ste*_*ers 0

事实证明,这个问题是由于我对@Configuration组件扫描如何拾取带有注释的 bean 缺乏了解所致。