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

最佳答案

您想要创建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());
}

08-28 17:41