有条件地根据其他豆选择豆

时间:2019-03-07 23:00:30

标签: java spring

说我有

interface A { ... }
class A1 implements A { ... }
class A2 implements A { ... }

@Lazy
@Configuration
class SpringConfig {
  @Bean
  A a1(DepA11 depA11, DepA12 depA12, ...) {
  }

  @Bean
  A a2(DepA21 depA21, DepA22 depA22, ...) {
  }
}

现在让我们说,有一些复杂的逻辑取决于一些注入的依赖关系,这些依赖关系会返回int

int choose(DepChoose1 depChoose1, DepChoose2 depChoose2, ...) {
  // Complex logic that depends on depChoose1, depChoose2, ...
  int res = ...; 
  return res;
}

,我希望Spring根据返回值自动连接a1a2

当务之急是不要实例化另一个bean(或一般来说,我们可以有a3a4,...的bean),因为每个bean都会在启动时进行繁重的处理,并且如果要最初选择另一个bean,则有一些副作用必须避免。

A1A2是类似流的项源,供系统其他部分使用。他们的一些(不是直接的)依赖项通过@PostConstruct进行了初始化。

它们的依赖项也是基于推送的。无论获取什么,它们都会推送到B,然后转发给其他使用者。因此,仅对它们进行初始化会产生不必要的推送。

我考虑过使用@Conditional,但是它是inherently doesn't support dependencies

在Spring中有一种简洁的方法吗?

2 个答案:

答案 0 :(得分:1)

也许不是您要找的解决方案,但是如果实例化(未使用的)bean的成本太高,请实例化工厂。

答案 1 :(得分:1)

两种可能性:

  • 如果choose始终返回相同的值,也就是说,您始终希望在上下文中使用a1a2,则只需定义一个@Bean方法,在其中执行检查并从中返回a1a2
  • 如果choose返回不同的值,则创建一个将充当工厂的新bean,因此您无需注入a1a2,而是注入工厂,然后调用例如。 getBean(),然后将调用choose并返回a1a2