Java 覆盖springbean

Java 覆盖springbean,java,spring,Java,Spring,我有以下情况: 具有多个bean配置的Spring项目,包括名为“searchHelper”的bean: 其中SearchHelperImpl实现“SearchHelper”接口 Spring项目B依赖于具有自定义SearchHelperImpl的A 我想做的只是将整个配置复制到新项目中,并更改需要更改的内容,但这并不方便,必须有一种更简单的方法 我的问题是,如何覆盖“searchHelper”bean的定义以使用SearchHelperImpl而不是SearchHelperImpl?我希望使

我有以下情况:

  • 具有多个bean配置的Spring项目,包括名为“searchHelper”的bean:

    其中SearchHelperImpl实现“SearchHelper”接口
  • Spring项目B依赖于具有自定义SearchHelperImpl的A
  • 我想做的只是将整个配置复制到新项目中,并更改需要更改的内容,但这并不方便,必须有一种更简单的方法

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

    谢谢

    注意
    这个答案与如何避免重复的bean定义有关。有关重写的信息,请参见


    避免复制的更有效的解决方案是将两个项目的所有公共bean放在一个单独的XML配置文件中,比如“common beans.XML”。在项目B(以及需要这些bean的任何其他项目)的配置XML文件中,导入该文件,如下所示:


    简单例子 示例-context.xml

    
    

    有用的阅读:

    您应该能够在
    bean
    元素上使用
    primary
    xml属性

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

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


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

    你可以更改项目A的配置吗?
    否?@informatik01是的,但是我应该把它放在哪里?我必须复制项目A中的所有bean吗?或者在项目B配置中单独定义这个bean就足够了吗?我试图做的是只使用项目A中的所有bean,并只覆盖所描述的“searchHelper”above@informatik01你能用你对一个单独的XML文件的评论来回答这个问题吗,这样我就可以标记它了?@OmarK抱歉不在,我会写一篇短文,没有问题这对不同配置类中具有相同方法名的bean不起作用。这是一个很好的观点。事实证明,即使项目A中的一个不是主要的,它仍然获胜(
    @Primary
    @Bean
    public SearchHelper searchHelper() {
        return new SearchHelperBImpl();
    }