@ConditionalOnProperty用于多值属性

Mak*_*huk 6 java spring yaml spring-boot

有什么方法可以使用基于多值属性的@ConditionalOnProperty注释?

弹簧配置:

@Bean
@ConditionalOnProperty(name = "prop", havingValue = "a")
public SomeBean bean1() {
    return new SomeBean1();
}

@Bean
@ConditionalOnProperty(name = "prop", havingValue = "b")
public SomeBean bean2() {
    return new SomeBean2();
}
Run Code Online (Sandbox Code Playgroud)

和application.yaml

prop: 
 - a
 - b
Run Code Online (Sandbox Code Playgroud)

我希望这两个bean:bean1和bean2都将在spring上下文中注册,但是没有一个未注册。有什么办法吗?

Ale*_*der 4

您不仅可以在 @bean 注释的方法中使用 Spring Boot @ConditionalOnExpression 注释,还可以直接在类上使用:

@ConditionalOnExpression("${my.prop}")
@Component
class SomeBean1 implements SomeBean {}

@ConditionalOnExpression("!${my.prop}")
@Component
class SomeBean2 implements SomeBean {}
Run Code Online (Sandbox Code Playgroud)

话虽如此,我个人更喜欢使用纯 Java:

@Value("${my.prop}") String myProp;
...
@Bean SomeBean someBean() {
    if ("abc".equals(myProp)) {return new SomeBean1();} else {return new SomeBean2();}
}
Run Code Online (Sandbox Code Playgroud)