我有以下情况:
<bean name="searchHelper" class="com.test.SearchHelperImpl"/>
我想要制作的只是将整个配置复制到新项目中并更改需要更改的内容,但这样做并不方便,必须有一种更简单的方法。
我的问题是,如何覆盖“searchHelper”bean的定义以使用 SearchHelperBImpl 而不是 SearchHelperImpl ?我想使用相同的bean名称,以便使用此名称的所有内容都使用新的实现。我使用的是Spring 3.2.2
由于
答案 0 :(得分:10)
您应该可以使用primary
元素上的bean
xml属性。
<bean name="searchHelper" primary="true" class="com.test.SearchHelperBImpl"/>
或者,如果您使用的是JavaConfig,则可以使用@Primary
注释。
@Primary
@Bean
public SearchHelper searchHelper() {
return new SearchHelperBImpl();
}
答案 1 :(得分:7)
Spring的一个有趣的“功能”(有些人认为它是一个错误)是配置中稍后声明的具有相同名称的bean将覆盖先前在配置中声明的bean。因此,如果您的项目B依赖于A,并且A中的配置包含在B中,并且B在A配置之后使用相同的名称定义bean,则B实例将“获胜”,这将是您将获得的实例。
我不建议取决于此行为,但会考虑有关主要注释的答案。我只是想我会提出这个问题,所以你会意识到即使没有主要的,或者如果项目A中的那个也主要,你就会知道最新的定义获胜。
答案 2 :(得分:2)
注
这个答案涉及如何避免重复的 bean定义。要覆盖,请参阅answer by nicholas.hauschild。
避免复制的更有效的解决方案是将两个项目共有的所有bean放在单独的XML配置文件中,比如“common-beans.xml”。在项目B的配置XML文件(以及需要这些bean的任何其他项目)中,您导入该文件如下:
<import resource="common-beans.xml" />
示例-context.xml中
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"
<!--
Assuming common-beans.xml is a Spring config file
that contains the definitions you need to use
in the current project.
-->
<import resource="common-beans.xml" />
<!-- Defining a bean with the implementaion you need -->
<bean name="searchHelper" class="com.test.SearchHelperBImpl"/>
<!-- Some other configurations if needed -->
</beans>