首页 > 解决方案 > 使用父子关系中的注释覆盖 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 的限制,我会更好奇

标签: javaspring

解决方案


您可以使用配置文件。

@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();
    }
}

推荐阅读