我正在查看春季公告@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());
}