Java bean创建回退的最佳实践是什么?
我有3个实现相同接口的bean。但我只想实例化其中一个,如果A可用,那么A,如果没有A,那么B,如果没有A和B,那么C。 当我只有两个时,它很简单,默认的一个有'@ConditionalOnMissingBean'注释。但不确定这是否适用于其中3个。 有可能用注释来解决这个问题吗?Java bean创建回退的最佳实践是什么?,java,spring,Java,Spring,我有3个实现相同接口的bean。但我只想实例化其中一个,如果A可用,那么A,如果没有A,那么B,如果没有A和B,那么C。 当我只有两个时,它很简单,默认的一个有'@ConditionalOnMissingBean'注释。但不确定这是否适用于其中3个。 有可能用注释来解决这个问题吗? 我不想创建factory方法,因为我有多个应用程序使用这些组件,并且我无法更改其中的一些组件。是的,使用@conditionalnmissingbean,您应该如下设置代码: @Configuration publi
我不想创建factory方法,因为我有多个应用程序使用这些组件,并且我无法更改其中的一些组件。是的,使用
@conditionalnmissingbean
,您应该如下设置代码:
@Configuration
public class ConditionalOnMissingBeanConfig {
@Bean
public A beanA(){
return new A(); // will initialize as normal
}
@Bean
@ConditionalOnMissingBean(name="beanA")
public B beanB(){
return new B(); // it will not initialize as
// beanA is present in the beanFactory.
}
@Bean
@ConditionalOnMissingBean(name="beanB")
public C beanC(){
return new C(); // will get initialized as there is no
// bean with name beanB in BeanFactory.
}
}
仅在beanfactory中缺少指定bean时匹配的条件。这仅在应用程序上下文处理bean定义时匹配,因此建议仅由自动配置类使用。让我提出一种替代方法: 您可以引入一个配置变量,该变量将表示系统应该做什么的“域”相关解释 例如: 如果A、B、C是不同的缓存策略(内存、redis、ehcache),则引入以下配置值:
caching.type=ehcache // or in-memory or redis
然后可以按如下方式声明bean:
@ConditionalOnProperty(name="caching.type" , havingValue="in-memory", matchIfMissing = true) // this is a fallback if no property is specified
class InMemoryCaching implements CachingStrategy {}
@ConditionalOnProperty(name="caching.type" , havingValue="ehcache", matchIfMissing = false)
class EhcacheCaching implements CachingStrategy {}
@ConditionalOnProperty(name="caching.type" , havingValue="redis", matchIfMissing = false)
class RedisCaching implements CachingStrategy {}
我知道它的解决方案略有不同,但它有以下好处:
- 添加接口的另一个实现很容易——现有bean中没有代码更改
- 在spring中,即使在bean名称级别上,bean也不知道彼此
- 易于调试-只需查看配置属性值
- 这种方法可以应用于
和管理bean集@配置
@ConditionalOnMissingBean
来覆盖,但不确定如何使用3个bean解决问题这是一个不错的解决方案,但不确定我正在寻找的是什么,因为带bean C的模块不知道A和BThanks。。。如果您使用3个变量作为模块之间共享的指标?