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

2023-12-21

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

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

    public abstract String getSpecifics();
}

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

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

...和...

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

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

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestConfig.class)
public class MyIntegrationTestIT { //... }

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


您当前的示例很可能无法编译。 AbstractConfig 应该看起来像这个代码片段,但我认为这只是一个复制/粘贴错误。

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

    public abstract String getSpecifics();
}

您正在寻找的功能是 @Profile 注释(请参阅https://spring.io/blog/2011/02/14/spring-3-1-m1-introducing-profile https://spring.io/blog/2011/02/14/spring-3-1-m1-introducing-profile更多细节)。您需要按如下方式更改您的代码

真实配置

package realPackage;
@Configuration
@Profile("real")
public class RealConfig extends AbstractConfig {
...

测试配置

package testPackage;
@Configuration
@ComponentScan(basePackages = {"testPackage", "realPackage" })
@Profile("test")
public class TestConfig extends AbstractConfig {

我的集成测试IT

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestConfig.class)
@ActiveProfiles("test")
public class MyIntegrationTestIT {
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Spring @Configuration 类继承不能按预期工作? 的相关文章

随机推荐