在运行时进行弹簧条件注入

时间:2018-11-02 01:00:56

标签: java spring

我正在查看春季公告@Conditional,以便对依赖项进行运行时条件连接。我有一个在构造函数中带有值的服务。我想用不同的构造函数输入创建服务的2个实例,然后根据运行时的条件,使用这个bean或那个bean。看来@Conditional是在启动时评估的。有没有其他方法可以使我的示例在运行时正常工作?

1 个答案:

答案 0 :(得分:1)

您要创建2个(或更多)实例,然后在运行时仅使用其中一个实例(这意味着它可能会在应用程序的生命周期内发生变化)。

您可以创建一个Holder bean,它将调用委托给正确的bean。

假设您拥有:

interface BeanInterface {
  // some common interface
  void f();
};

// original beans a & b
@Bean
public BeanInterface beanA() {
   return new BeanAImpl();
}

@Bean
public BeanInterface beanB() {
   return new BeanBImpl();
}

然后创建一个包装器bean:

class Wrapper implements BeanInterface {

   public Wrapper(BeanInterface... beans) { this.delegates = beans };

   private BeanInterface current() { return ... /* depending on your runtime condition */ }

   @Override
   public void f() {
     current().f();
   }
}

显然,您需要在配置中创建包装器

@Bean
public BeanInterface wrapper() {
   return new Wrapper(beanA(), beanB());
}