覆盖Spring bean

时间:2013-11-04 21:58:02

标签: java spring

我有以下情况:

  1. 具有多个bean配置的Spring项目A,包括名为“searchHelper”的bean:
    <bean name="searchHelper" class="com.test.SearchHelperImpl"/>
    其中 SearchHelperImpl 实现“SearchHelper”接口
  2. Spring项目B依赖于A与自定义 SearchHelperBImpl
  3. 我想要制作的只是将整个配置复制到新项目中并更改需要更改的内容,但这样做并不方便,必须有一种更简单的方法。

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

    由于

3 个答案:

答案 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>

有用的阅读:

相关问题