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.
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 sayingclasspath:springfolder
, you can explicitly import the core configuration in your war's Spring config file and then override the bean this way: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