Java Spring引导bean以@ConfigurationProperties值为条件
Spring Boot使用Java Spring引导bean以@ConfigurationProperties值为条件,java,spring,spring-boot,Java,Spring,Spring Boot,Spring Boot使用@ConfigurationProperties注释为我们提供了类型化的配置对象。优点之一是在使用Spring引导注释处理器时,可以免费在IDE中完成属性名。另一个问题是:验证 现在,我想让bean以属性的值为条件。实际上,我有两个接口的实现,这个属性告诉我应该使用哪一个。我可以这样实现它: 实现a.java @Component @ConditionalOnProperty(name = "foo.bar", havingValue = "a") public cla
@ConfigurationProperties
注释为我们提供了类型化的配置对象。优点之一是在使用Spring引导注释处理器时,可以免费在IDE中完成属性名。另一个问题是:验证
现在,我想让bean以属性的值为条件。实际上,我有两个接口的实现,这个属性告诉我应该使用哪一个。我可以这样实现它:
实现a.java
@Component
@ConditionalOnProperty(name = "foo.bar", havingValue = "a")
public class ImplementationA implements SomeInterface { ... }
@Component
@ConditionalOnProperty(name = "foo.bar", havingValue = "b")
public class ImplementationB implements SomeInterface { ... }
@ConfigurationProperties(prefix = "foo")
public class FooProperties {
private String bar;
public String getBar() { ... }
public void setBar(String bar) { ... }
}
ImplementationB.java
@Component
@ConditionalOnProperty(name = "foo.bar", havingValue = "a")
public class ImplementationA implements SomeInterface { ... }
@Component
@ConditionalOnProperty(name = "foo.bar", havingValue = "b")
public class ImplementationB implements SomeInterface { ... }
@ConfigurationProperties(prefix = "foo")
public class FooProperties {
private String bar;
public String getBar() { ... }
public void setBar(String bar) { ... }
}
application.yml
foo:
bar: "a"
然而,我将失去类型化配置的优势。因此,我想在
@ConfigurationProperties
对象中声明此属性:
FooProperties.java
@Component
@ConditionalOnProperty(name = "foo.bar", havingValue = "a")
public class ImplementationA implements SomeInterface { ... }
@Component
@ConditionalOnProperty(name = "foo.bar", havingValue = "b")
public class ImplementationB implements SomeInterface { ... }
@ConfigurationProperties(prefix = "foo")
public class FooProperties {
private String bar;
public String getBar() { ... }
public void setBar(String bar) { ... }
}
这仍然有效,但是当我在这个类中为bar
声明一个默认值时,@ConditionalOnProperty
显然不会拾取它,因为这个注释直接针对环境运行(按设计)。所以最好不要把这些概念混在一起
所以问题是。。。
是否有一种基于@ConfigurationProperties
对象中的值的条件bean的方法?最好使用一些@条件
注释,而不创建@配置
bean,因为这意味着样板代码。它可能没有那么性感,但一个潜在的解决方案可能是将配置自动连接到SomeInterfaceConfiguration中,该配置创建并提供基于FooProperties的服务实现
i、 e
另一种选择是使用配置文件,但它与您所需的解决方案不同。
i、 e.有一个默认的实现
@Component
public class ImplementationA
@Profile("b")
@Primary
@Component
public class ImplementationB
@ConfigurationProperties
位于组件扫描链中的@Conditional…
注释下方。因此,我认为这是不可能的。所有的@Conditional
注释,如@Conditional
、@Conditional属性
和@Conditional属性
都是在@ConfigurationProperties
之前执行的?像以前一样创建FooProperties,但是添加一个带有默认值的静态常量,并在conditionalOnProperty的“havingValue”属性中引用该常量。您是否找到了问题的答案?