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
CustomService
,他应该能够忽略这两个默认实现,并提供自己的bean
注意:这是一个初学者项目,因此用户向my jar添加了一个依赖项,并应根据其yaml/配置注入FooService、BarService或CustomService
以下是我尝试过的:
- 在
中,我有一个字段@ConfigurationProperties
(foo是默认值)字符串serviceType=“foo”
@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错误。第二条信息很有价值。。。这有望解决我的问题。你愿意把它作为一个答案,这样我就可以给你评分了吗?