java - 使用父子关系中的注释覆盖 Spring Bean
问题描述
我有两个处于父子关系的类,第二个是第一个的模拟。
public class A {
public void doSomething(){...};
}
public class MockA extends A {
@Override
public void doSomething() {...};
}
我还有两个@Configuration 类,一个用于开发环境,一个用于测试,测试一个只是模拟了几个行为,但它导入了开发一个。无论哪种方式,我都希望在测试环境中注入 MockA 并在开发中将 A 类注入到自动装配它的其他服务中。
如果我在测试配置中覆盖 bean,我可以做到这一点。以下将起作用:
@Configuration
public class ApplicationConfig {
@Bean
public A beanA() {
return new A();
}
}
@Configuration
public class TestApplicationConfig {
@Bean
public A beanA() {
return new MockA();
}
}
但是,我不想在 @Configuration 类中创建 bean。我想将@Component 注释放在每一个上,并让它们正确地注入服务中。
我尝试了两种方法
1)创建一个虚拟注释,在类A上添加注释并尝试从TestApplicationConfig中排除bean。
@Configuration
@ComponentScan(
basePackages = {
"murex.connectivity.tools.interfaces.monitor.cellcomputer",
"murex.connectivity.tools.interfaces.monitor"
}, excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes =
MyAnnotation.class))
public class TestApplicationConfig {
}
2) 在 MockA 类上使用 @Component 和 @Primary 注释。我的逻辑是,在两者都存在的情况下(这只会发生在测试用例上,因为只有这样 MockA 才会被扫描),MockA 将被注入到任何地方。但这不会发生。
我想知道我做错了什么还是这是Spring的限制?@Primary 注释似乎正是针对这种特定情况构建的,我弄错了吗?这两个类具有父子关系的事实是问题所在吗?
LE 使用两个不同的配置文件将起作用。如果我对所提出的两种方法的理解是正确的和/或这是否是对使用 @Component 注释的 Spring 的限制,我会更好奇
解决方案
您可以使用配置文件。
@Profile("!test")
@Configuration
public class ApplicationConfig {
@Bean
public A beanA() {
return new A();
}
}
对于测试用例:在 application.properties 中的测试资源中:spring.profiles.active=test
或在测试类中@ActiveProfiles("test")
并创建配置:
@Profile("test")
@Configuration
public class TestApplicationConfig {
@Bean
public A beanA() {
return new MockA();
}
}
推荐阅读
- spring-boot - 当数据库在 SpringBoot 中具有其真实值时,API 为字段返回 0
- mysql - “SQLSTATE[22007]:无效的日期时间格式:1366 不正确的整数值:
- postgresql - 使用 POSTGRESQL 的记录和数组
- redirect - 未经请求的 URL 重定向
- ios - SWIFT:如何通过单击保存按钮在现有子项上添加键值?
- r - 如何在 word 文本文件的表格中报告 REPEATED MEASURES ANOVA 输出?
- android - 反应本机 firebase 实时数据库参考返回 null
- memory - 如何访问另一个进程的页表?
- powerbi - PowerBI 中的转换数据选项
- javascript - 替代 shouldComponentUpdate 的方法