gpt4 book ai didi

java - 为什么 Spring @Configuration 类继承没有按预期工作?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:58:20 25 4
gpt4 key购买 nike

我有一个包含公共(public) bean 的抽象 Spring 配置类:

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

public abstract String getSpecifics();
}

公共(public) 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 中颠倒包的顺序,则会使用 "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)。您需要按如下方式更改代码

真实配置

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

测试配置

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

我的集成测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestConfig.class)
@ActiveProfiles("test")
public class MyIntegrationTestIT {
...

关于java - 为什么 Spring @Configuration 类继承没有按预期工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31650419/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com