Bean创建后备的最佳实践是什么?

时间:2020-01-09 13:25:16

标签: java spring

我有3个实现相同接口的bean。但是我只想实例化它们中的一个,如果A可用,那么A,如果没有A,那么B,如果没有A和B,那么C。 当我只有两个时,这很简单,默认情况下,其中一个带有“ @ConditionalOnMissingBean”注释。但不确定是否可以与其中3个一起使用。 是否可以通过注释解决此问题? 我不想创建工厂方法,因为我有多个使用这些组件的应用程序,而且我没有能力更改其中的一些

2 个答案:

答案 0 :(得分:1)

是的,您可以使用@ConditionalOnMissingBean annotation来设置以下代码:

@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定义时才匹配,因此建议仅由自动配置类使用。

答案 1 :(得分:0)

让我提出另一种方法:

您可以引入一个配置变量,该变量将表示与系统应执行的“域”相关的解释

示例:

例如,如果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中没有代码更改
  • 即使在春季,甚至在豆名的级别上,豆也不会相互了解
  • 易于调试-只需查看配置属性值
  • 该方法可以应用于@Configuration并管理一组bean