gpt4 book ai didi

java - 如何在保留参数的同时覆盖spring bean?

转载 作者:太空宇宙 更新时间:2023-11-04 09:04:10 26 4
gpt4 key购买 nike

我有两个项目,库和应用程序。库定义了一个 CommonService 接口(interface),我想在应用程序中覆盖它。我使用 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>

应用程序配置(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());
}

问题出在 testApplicationXML:commonService 应该返回“Overridden: Message: Hello!”,但它返回“Overridden: Message: null”。

我已将所有代码放到 github 上(为了简单起见,库和应用程序位于一个项目中): https://github.com/mateattila/spring-test-sandbox

我发现Spring实例化了OverriddenServiceImpl,但没有从以前的定义继承参数。我尝试过使用 bean 继承,但在这种情况下我必须使用不同的 bean id,我想避免它。我尝试使用基于注释的配置并且它有效,但它会产生大量开销(请参阅 OverriddenConfiguration 和 testApplicationAnnotation)。

有什么想法可以用 Spring 来处理这个需求吗?我也对如何扩展 Spring 像这样工作感兴趣。

最佳答案

在跟进 @M.Deinum 的评论后,我找到了非常简单的解决方案:使用 bean 名称而不是 bean id。名称覆盖工作正常。我已将修复提交给 github repository ,无论如何,这就是:

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());
}

关于java - 如何在保留参数的同时覆盖spring bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60432953/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com