Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring引导bean以@ConfigurationProperties值为条件_Java_Spring_Spring Boot - Fatal编程技术网

Java Spring引导bean以@ConfigurationProperties值为条件

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

Spring Boot使用
@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”属性中引用该常量。您是否找到了问题的答案?