Существует весенний проект А, полностью основанный на аннотациях.
Мне нужно переопределить некоторые bean-компоненты условно в проекте B, который является устаревшим приложением, использующим Spring 4.1.3, и использует конфигурацию на основе xml.
Существует FooConfig, который конфигурирует bean-компоненты с помощью @ComponentScan. Этот конфиг для меня сторонний код. у меня нет доступа к этому
@ComponentScan(basePackages = {"com.foo.bean"})
@Configuration
public class FooConfig {
}
Я создал BarConfig на моем конце, который импортирует этот FooConfig и переопределяет некоторые bean-компоненты в зависимости от условия. Это достигается с помощью @ Conditional
@Configuration
@Import(FooConfig.class)
public class BarConfig {
@Bean(name="helloService")
@Conditional(IsSpanishCondition.class)
public HelloService getHelloService() {
return new HelloService() {
@Override
public String getGreeting(String name) {
return "Hola "+name;
}
};
}
}
И я включил BarConfig в мой application-context.xml
<context:annotation-config/>
<bean class="com.foo.config.BarConfig"/>
Хотя этот подход работает безупречно в Spring 5.1.2.RELEASE, он не работает в Spring 4.1.3.RELEASE
00: 14: 20.617 [main] INFO org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader - Пропуск определения бина для [BeanMethod: name = getHelloService, declaringClass = com.foo.config.BarConfig]: определение для heller ' уже существует. Это определение bean-объекта верхнего уровня считается переопределением.
Кроме того, я наблюдал ту же проблему в Spring 4 в контексте, полностью основанном на аннотациях. то есть это происходит не из-за смешивания конфигурации xml и аннотаций, а из-за версий Spring, используемых здесь
Вопросы
Что изменилось весной 5?
Есть ли эмпирическое правило при работе с приложением Spring, которое использует конфигурацию xml и аннотации, особенно когда речь идет о переопределении bean-компонентов?
Также FTR, это решения, которые работали
1. Переопределение бобов с помощью BeanPostProcessor
2. Использование профилей. Но это не сработает для сложных условий.
@Profile("ENGLISH")
@Configuration
@Import(FooConfig.class)
public class EnglishConfig {
}
@Profile("SPANISH")
@Configuration
public class SpanishConfig {
@Bean(name="helloService")
public HelloService getHelloService() {
return new HelloService() {
@Override
public String getGreeting(String name) {
return "Hola "+name;
}
};
}
}