Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

overriding bean configuration in spring

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.

like image 407
Pokuri Avatar asked Aug 06 '12 18:08

Pokuri


People also ask

What is @configuration and @bean in spring?

Spring @Configuration annotation is part of the spring core framework. Spring Configuration annotation indicates that the class has @Bean definition methods. So Spring container can process the class and generate Spring Beans to be used in the application.

Can we use @bean without @configuration?

@Bean methods may also be declared within classes that are not annotated with @Configuration. For example, bean methods may be declared in a @Component class or even in a plain old class. In such cases, a @Bean method will get processed in a so-called 'lite' mode.


1 Answers

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

like image 157
Biju Kunjummen Avatar answered Oct 24 '22 23:10

Biju Kunjummen