Как переопределить бобы при сохранении параметров? - PullRequest
1 голос
/ 27 февраля 2020

У меня есть два проекта, библиотека и приложение. Библиотека определяет интерфейс CommonService, который я хотел бы переопределить в приложении. Я использую Spring XML для конфигурации. Код для библиотеки:

public interface CommonService {
  String service();
}

public class CommonServiceImpl implements CommonService {

  private String message;
  // + getter/setter

  @Override
  public String service() {
    return "Message: " + getMessage();
  }

}

Код для приложения:

public class OverriddenServiceImpl extends CommonServiceImpl {

  @Override
  public String service() {
    return "Overridden: " + super.service();
  }
}

Конфигурация для библиотеки (lib-config. xml):

  <bean id="commonService" class="spring.context.test.library.CommonServiceImpl">  
    <property name="message" value="Hello!" />
  </bean>

Конфигурация для application (app-config. xml):

  <import resource="classpath:/lib-config.xml"/>
  <bean id="commonService" 
    class="spring.context.test.application.OverriddenServiceImpl">  
  </bean>

Тестирование:

  @Test
  void testLibraryXML() {
    ApplicationContext context = new ClassPathXmlApplicationContext("classpath:/lib-config.xml");
    CommonService commonService = context.getBean("commonService", CommonService.class);
    assertEquals("Message: Hello!", commonService.service());
  }

  @Test
  void testApplicationXML() {
    ApplicationContext context = new ClassPathXmlApplicationContext("classpath:/app-config.xml");
    CommonService commonService = context.getBean("commonService", CommonService.class);
    // FIXME!! this gives Overridden: Message: null
    assertEquals("Overridden: Message: Hello!", commonService.service());
  }

Проблема с testApplication XML: commonService должен вернуть "Переопределено: Сообщение: Здравствуйте! ", но возвращает" Переопределено: Сообщение: null ".

Я поместил весь код в github (для простоты библиотека и приложение находятся в одном проекте): https://github.com/mateattila/spring-test-sandbox

Я обнаружил, что Spring создает экземпляр OverriddenServiceImpl, но не наследует параметры из предыдущих определений. Я пытался использовать наследование бина, но в этом случае мне нужно использовать другой идентификатор бина, и я бы хотел этого избежать. Я пытался использовать конфигурацию на основе аннотаций, и она работает, но это создает много накладных расходов (см. OverriddenConfiguration и testApplicationAnnotation).

Есть идеи, как справиться с этим требованием с помощью Spring? Мне также интересно, как расширить Spring таким образом.

1 Ответ

0 голосов
/ 28 февраля 2020

После изучения комментария @ M.Deinum я нашел очень простое решение: использовать имя компонента вместо идентификатора компонента. Переопределение имени работает отлично. Я зафиксировал исправление в github репозитории , вот оно в любом случае:

lib-config.xml:
    <bean id="commonService" name="service"
          class="spring.context.test.library.CommonServiceImpl">  
        <property name="message" value="Hello!" />
    </bean>

app-config.xml:
    <bean id="commonService2" name="service" 
          class="spring.context.test.application.OverriddenServiceImpl"
          parent="commonService">  
    </bean>

Прохождение теста:

  @Test
  void testApplicationXML_FIXED() {
    ApplicationContext context = new ClassPathXmlApplicationContext("classpath:/app-config.xml");
    CommonService commonService = context.getBean("service", CommonService.class);
    assertEquals("Overridden: Message: Hello!", commonService.service());
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...