overriding bean configuration in spring

45,131

One way of overriding the bean definition is what you have indicated - to define it with the same id multiple times and the last bean definition with the same id is the one which takes effect. So if you ensure that ExtX is the last one loaded up, it should just work, and to ensure this you can do this in your war file, instead of loading up by saying classpath:springfolder, you can explicitly import the core configuration in your war's Spring config file and then override the bean this way:

<import resource="core-resource.xml"/>
<bean id="x" class="com.pokuri.ExtX">
     <property name="y" ref="y"/>
     <property name="z" ref="z"/>
</bean>

This will ensure that your overridden bean is the one which takes effect.

There is no priority/order field that you can make use of here though - if you want you can load up all bean definitions of a type by providing Map<String,X> as a parameter, and sort it by expecting an order property and use it that way, but there is lot more work to it.

A second approach is described here: Overriding the bean defined in parent context in a child context

Share:
45,131
Pokuri
Author by

Pokuri

Just wants to know!

Updated on October 07, 2020

Comments

  • Pokuri
    Pokuri over 3 years

    Let's say I have two modules. One is core and another is core dependent implementation module. Core is a jar file for that dependent implementation module war.

    In the core I have a bean defined like

    <bean id="x" class="com.pokuri.X">
     <property name="y" ref="y"/>
     <property name="z" ref="z"/>
    </bean>
    

    And that class has a method as follows

    public class X{
    
      public void doSomeJob(){
       .......
      }   
    
    }
    

    this method is being called from some core classes. Now I need to alter the logic in that doSomeJob() method of X as per my core dependent implementation. So, I create a class like this

    public class ExtX extends X{
    
      @override
      public void doSomeJob(){
        // changed logic
      }
    
    }
    

    and defined the bean with same id in another application context xml file like this.

    <bean id="x" class="com.pokuri.ExtX">
         <property name="y" ref="y"/>
         <property name="z" ref="z"/>
    </bean>
    

    and we are building application context using contextConfigLocation context parameter in web.xml specifying value as classpath:springfolder.

    But in the core logic I am getting core bean instance only(i.e X instance) not ExtX. How can we override that bean definition and let system start using new extend bean definition?

    And I heard that with same ID in different application context files will override first loaded bean definition with later loaded bean definition. Is there any priority kind of attribute on bean definition to let ApplicationContext use highest priority one to consider over low priority one when beans with same ID were found.

  • Łukasz Rzeszotarski
    Łukasz Rzeszotarski over 10 years
    Of course it works. But is it a good practice to cover one definition by another? I think it is kind of hack :/