Spring @Profile 和自动装配匹配

3
我正在使用Spring框架(版本3.2),在应用程序中进行了一些重构之后,我遇到了关于配置文件的自动装配问题。
假设我有一个接口,由两个类实现。这些类根据环境设置实现了一堆方法。实际上,我有三个不同的配置文件profile1、profile2和profile3。使用配置文件很好用,但是这里我第一次遇到了一个小问题,因为找到了两个候选项,所以无法注入类。
public interface Iexample {
  public void doSomething();
}

@Profile("profile1")
public class classA implements Iexample {
  doSomething(){..}
}

@Profile("{profile2, profile3}")    
public class ClassB implements Iexample {
  doSomething(){..}
}

public class Test1 {

@Autowired
Iexample example; //Should use implementation based on profile1 or profile2

}

public class Test2 {

@Autowired
Iexample example; //Should use implementation based on profile3 only

}

当前配置的属性:

spring.profiles.active= profile1,profile3

可能的配置

  • 配置文件1,配置文件3
  • 配置文件2,配置文件3

是否有一种方法可以指定在任何情况下应该实现哪个类(类似于@Qualifier)?

为什么不使用@ActiveProfiles?

@ActiveProfiles是一个类级别的注解,用于声明在加载测试类的ApplicationContext时应该使用哪些活动的bean定义配置文件。

在这种情况下,我需要知道是否有一种方式可以根据配置文件来确定应该注入哪个类。

请参考下面的示例。

@Controller
public class exampleController {
    @Autowired
    // Suppose that this can be possible
    @Qualifier("{profile1, profile2}")
    Iexample example
}

如果以这种方式指定限定符可能有效,那么我就能解决这个问题。
谢谢。

使用@ActiveProfiles给您的测试用例打上注释。 - Mike R
我已经根据您的评论更新了问题。 - Daniel Macikowski
1个回答

0

您可以使用 @Primary 注解标注一个 bean,以指定它作为自动装配候选对象的优先级。该 javadoc 适用于 Spring 4,但是 Spring 3.2 的文档也提到了该注解。


我考虑使用@Primary注解,但是有些情况下我无法确定哪个实现可以作为默认值。唯一确定需要的地方是在注入接口的类中。请查看Test1和Test2类中的注释。无论如何,感谢您的提示。 - Daniel Macikowski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接