9

我有以下情况:

  1. Spring项目A,有多个bean配置,包括一个名为“searchHelper”的bean:
    <bean name="searchHelper" class="com.test.SearchHelperImpl"/>
    其中SearchHelperImpl实现了“SearchHelper”接口
  2. Spring 项目 B 依赖于具有自定义SearchHelperBImpl的 A

我想做的只是将整个配置复制到新项目中并更改需要更改的内容,但这并不方便,必须有更简单的方法来执行此操作。

我的问题是,如何覆盖“searchHelper”bean 的定义以使用SearchHelperBImpl而不是SearchHelperImpl?我想使用相同的 bean 名称,以便使用此名称的所有内容都使用新的实现。我正在使用 Spring 3.2.2

谢谢

4

3 回答 3

10

您应该能够在您的元素上使用primaryxml 属性。bean

<bean name="searchHelper" primary="true" class="com.test.SearchHelperBImpl"/>

或者,如果您使用的是 JavaConfig,则可以使用@Primary注解。

@Primary
@Bean
public SearchHelper searchHelper() {
    return new SearchHelperBImpl();
}
于 2013-11-04T23:40:51.330 回答
7

Spring 的一个有趣的“特性”(有些人认为这是一个错误)是稍后在配置中声明的具有相同名称的 bean 将覆盖在配置中较早声明的 bean。因此,如果您的项目 B 依赖于 A,并且 A 中的配置包含在 B 中,并且 B 在 A 配置之后以相同的名称定义了一个 bean,那么 B 实例将“获胜”,这就是您将获得的实例。

我不建议依赖这种行为,但会选择关于主要注释的答案。我只是想我会提出这个问题,这样你就会知道,即使没有主要的,或者如果项目 A 中的那个也是主要的,你就会知道最新的定义会获胜。

于 2013-11-05T03:09:34.103 回答
2

注意
此答案与如何避免重复的bean 定义有关。对于压倒一切,请参阅nicholas.hauschild 的答案


避免复制的更有效解决方案是将两个项目通用的所有 bean 放在单独的 XML 配置文件中,例如“common-beans.xml”。在项目 B(以及需要这些 bean 的任何其他项目)的配置 XML 文件中,您可以像这样导入该文件:

<import resource="common-beans.xml" />


简单的例子

示例上下文.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>

有用的阅读:

于 2013-11-04T22:32:19.807 回答