Не новый способ, но в вашем случае я думаю, что возможным подходящим способом было бы использование FactoryBean
в классе, который хочет вводить bean-компонент условно.
Идея проста: вы реализуете FactoryBean
с помощьюпараметризация его с помощью интерфейса bean-компонента, который вы хотите внедрить и переопределить getObject()
для внедрения желаемой реализации:
public class FactoryBeanA implements FactoryBean<A> {
@Autowired
private ApplicationContext applicationContext;
@Value("${should-Aa-be-used}")
private boolean shouldBeUsed;
@Override
public A getObject() {
if (shouldBeUsed) {
return applicationContext.getBean(Aa.class));
return applicationContext.getBean(Ab.class));
}
}
Но экземпляры FactoryBean не являются классическими bean-компонентами.Вы должны настроить это специально.
Вы можете настроить его в конфигурации Spring Java следующим образом:
@Configuration
public class FactoryBeanAConfiguration{
@Bean(name = "factoryBeanA")
public FactoryBeanA factoryBeanA() {
return new FactoryBeanA();
}
@Bean
public beanA() throws Exception {
return factoryBeanA().getObject();
}
}