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