У меня есть два проекта, библиотека и приложение. Библиотека определяет интерфейс 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 таким образом.