Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.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定义并允许自定义bean_Java_Spring Boot - Fatal编程技术网

Java 按属性切换spring引导bean定义并允许自定义bean

Java 按属性切换spring引导bean定义并允许自定义bean,java,spring-boot,Java,Spring Boot,假设一个接口服务{}。我的平台提供了此接口的两种实现: FooService BarService 我现在想要的是,用户可以通过yaml选择要使用的服务。此外,如果他更愿意使用CustomService,他应该能够忽略这两个默认实现,并提供自己的bean 注意:这是一个初学者项目,因此用户向my jar添加了一个依赖项,并应根据其yaml/配置注入FooService、BarService或CustomService 以下是我尝试过的: 在@ConfigurationProperties中

假设一个
接口服务{}
。我的平台提供了此接口的两种实现:

  • FooService
  • BarService
我现在想要的是,用户可以通过yaml选择要使用的服务。此外,如果他更愿意使用
CustomService
,他应该能够忽略这两个默认实现,并提供自己的bean

注意:这是一个初学者项目,因此用户向my jar添加了一个依赖项,并应根据其yaml/配置注入FooService、BarService或CustomService

以下是我尝试过的:

  • @ConfigurationProperties
    中,我有一个字段
    字符串serviceType=“foo”
    (foo是默认值)
在我的自动配置中,我提供两个bean:

 @EnableConfigurationProperties(MyProperties.class)
 public class MyAutoConfiguration  {
   @Bean
   @ConditionalOnMissingBean(Service.class) // only active if no custom present
   @ConditionalOnProperty(name="service-type", havingValue = "foo")
   public Service fooService() {
      return new FooService();
   }

   @Bean
   @ConditionalOnMissingBean(Service) // only active if no custom present
   @ConditionalOnProperty(name="service-type", havingValue = "bar")
   public Service barService() {
      return new BarService();
   }
}
创建第一个简单的测试时,我假设注入了FooService,但是我得到了一个ApplicationContext异常,因为没有为
服务
接口注册bean。在这个测试中,我没有在yaml中为“服务类型”设置任何值,我依赖于默认的“foo”


我的错在哪里?我不能在两个豆子上加一个豆子吗?在评估属性的条件时是否未考虑默认的“foo”?是否有其他方法可以解决一般问题:提供比默认bean更多的内容,并且仍然允许用户覆盖?

@ConditionalOnProperty
由实现,它在
环境中查看
以检查属性是否存在。在
@ConfigurationProperties
注释类中添加上的属性不会将该值添加到属性中。因此,检查仍然失败

但是,
@ConditionalOnProperty
als有一个可以设置的属性。默认值为
false
,因此如果将
foo
的值设置为
true
,则如果未明确设置该值,该值将匹配

@ConditionalOnProperty(name="service-type", 
                       havingValue = "foo", 
                       matchIfMissing=true)

首先,您要检查两种不同类型的缺失bean(类型不同)。另外,
条件属性
检查
环境
中的属性,以便在
@ConfigurationProperties
注释bean中设置未考虑的默认值。相反,将默认值的
match if missing
设置为
true
不同类型的c&p错误。第二条信息很有价值。。。这有望解决我的问题。你愿意把它作为一个答案,这样我就可以给你评分了吗?