Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.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 bean创建回退的最佳实践是什么?_Java_Spring - Fatal编程技术网

Java bean创建回退的最佳实践是什么?

Java bean创建回退的最佳实践是什么?,java,spring,Java,Spring,我有3个实现相同接口的bean。但我只想实例化其中一个,如果A可用,那么A,如果没有A,那么B,如果没有A和B,那么C。 当我只有两个时,它很简单,默认的一个有'@ConditionalOnMissingBean'注释。但不确定这是否适用于其中3个。 有可能用注释来解决这个问题吗? 我不想创建factory方法,因为我有多个应用程序使用这些组件,并且我无法更改其中的一些组件。是的,使用@conditionalnmissingbean,您应该如下设置代码: @Configuration publi

我有3个实现相同接口的bean。但我只想实例化其中一个,如果A可用,那么A,如果没有A,那么B,如果没有A和B,那么C。 当我只有两个时,它很简单,默认的一个有'@ConditionalOnMissingBean'注释。但不确定这是否适用于其中3个。 有可能用注释来解决这个问题吗?
我不想创建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集

bean在不同的模块中吗?你能展示一个有两个bean的java示例吗?@MarkBramnik每个bean位于不同的模块中,我有3种类型的应用程序。一个包含所有3个bean,一个包含B和C,最后一个类型只有C。场景2和3可以通过在类/工厂中添加注释
@ConditionalOnMissingBean
来覆盖,但不确定如何使用3个bean解决问题这是一个不错的解决方案,但不确定我正在寻找的是什么,因为带bean C的模块不知道A和BThanks。。。如果您使用3个变量作为模块之间共享的指标?