到目前为止,我有一个非常简单的bean定义,如下所示:
@Bean
@Conditional(value=ConditionClass.class)
SomeInterface myMethodImpl(){
return new ImplementationOne();
}
但是,我现在遇到了添加了其他实现类的情况,我们称它为ImplementationTwo
,当在配置文件中启用该选项时,需要使用它代替ImplementationOne
。
所以我需要这样的东西:
@Bean
@Conditional(value=ConditionClass.class)
SomeInterface myMethodImpl(){
return context.getEnvironment().getProperty("optionEnabled") ? new
ImplementationOne() : new ImplementationTwo();
}
基本上是一种在bean定义时实例化基于配置值的正确实现的方法。这可能吗,任何人都可以提供示例吗?谢谢
答案 0 :(得分:2)
无需使用@Conditional
即可实现此目的。
假设您有一个接口SomeInterface
和两个实现ImplOne
ImplTwo
:
SomeInterface.java
public interface SomeInterface {
void someMethod();
}
ImplOne.java
public class ImplOne implements SomeInterface{
@Override
public void someMethod() {
// do something
}
}
ImplTwo.java
public class ImplTwo implements SomeInterface{
@Override
public void someMethod() {
// do something else
}
}
然后,您可以控制在配置类中使用哪种实现,如下所示:
MyConfig.java
@Configuration
public class MyConfig {
@Autowired
private ApplicationContext context;
@Bean
public SomeInterface someInterface() {
if (this.context.getEnvironment().getProperty("implementation") != null) {
return new ImplementationOne();
} else {
return new ImplementationTwo();
}
}
}
确保spring的组件扫描找到MyConfig
。然后,您可以使用@Autowired
在代码中的其他任何地方注入正确的实现。
答案 1 :(得分:1)
我认为您做错了。
您应该在实现上而不是在界面上使用@Conditional()
。
这是我要怎么做:
您将在代码中使用的界面。
MyInterface.java
public interface MyInterface {
void myMethod();
}
第一个实现:
MyInterfaceImplOne.java
@Bean
@Conditional(MyInterfaceImplOneCondition.class)
public class MyInterfaceImplOne implements MyInterface {
void myMethod(){
// dosmthg
}
}
MyInterfaceImplOneCondition.java
public class MyInterfaceImplOneCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return context.getEnvironment().getProperty("optionEnabled")
}
}
对于第二种实现:
MyInterfaceImplTwo.java
@Bean
@Conditional(MyInterfaceImplTwoCondition.class)
public class MyInterfaceImplTwo implements MyInterface {
void myMethod(){
// dosmthg 2
}
}
MyInterfaceImplTwoCondition.java
public class MyInterfaceImplTwoCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return !context.getEnvironment().getProperty("optionEnabled")
}
}
在那种情况下,您现在只需要调用接口,Spring就会根据正确的条件注入bean。
希望这就是您要寻找的东西,我已经很清楚了!