Переопределение bean-компонента в контексте Spring, использующее аннотацию и конфигурацию xml - PullRequest
0 голосов
/ 26 января 2019

Существует весенний проект А, полностью основанный на аннотациях. Мне нужно переопределить некоторые 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;
            }
        };
    }
}

1 Ответ

0 голосов
/ 28 января 2019

Проблема здесь в том, что вы пытаетесь переопределить bean-компонент xml из класса @Configuration, теперь я не уверен на 100%, но весной 4 bean-компонент xml все еще имел преимущество при выборе bean-компонента, поэтому @Configuration bean-компоненты не получат разрешение перезаписывать bean-компонент xml. Которая была решена весной 5.

Ваш подход к использованию BeanPostProcessor - единственное жизнеспособное решение для этого.

Я думаю, что, возможно, вы могли бы использовать другое имя компонента, реализовать свое собственное поведение и использовать аннотацию @Qualifier, чтобы выбрать, какой компонент будет выбран?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...