spring - Override bean definition doesn't work as expected -


i'm confused spring's annotation based configuration.

i have interface myinterface , 2 classes (myclass1 , myclass2) implement interface.

@component("myinterface") public class myclass1 implements myinterface {      public void execute() {         system.out.println("myclass1 executed");     } }  public class myclass2 implements myinterface {      public void execute() {         system.out.println("myclass2 executed");     } } 

myclass1 created using component-scan, myclass2 defined bean:

@configuration @componentscan(basepackageclasses = myclass1configuration.class) public class myclass1configuration {  }  @configuration public class myclass2configuration {      @bean(name = "myinterface")     public myinterface myclass2() {         return new myclass2();     } } 

i build application context using spring test's contextconfiguration annotation:

@runwith(springjunit4classrunner.class) @contextconfiguration(classes = {myclass1configuration.class, myclass2configuration.class}) public class springtestcase1 {      @autowired     private myinterface myinterface;      @test     public void testmethod() {         system.out.println("testmethod invoked");         assert.assertequals(myclass2.class, myinterface.getclass());         myinterface.execute();     } } 

unfortunately test failes class1 autowired instead of class2. expected behaviour myclass2configuration overrides beans defined myclass1configuration. what's fault.

i created example @ github, if take @ working example: https://github.com/olibutzki/spring-test-configuration/tree/master/simple-sprint-test

thanks help.

kind regards oliver

you're quite near... first, cannot have 2 beans same name in same spring context, unless you're allowing it, don't recommend since it's error-prone.

besides that, should use @primary annotation, can applied both @ method , type level. in case, should apply @ method level in myclass2configuration:

@configuration public class myclass2configuration {      @bean     @primary     public myinterface myclass2() {         return new myclass2();     } } 

as you're autowiring type (and not name), doesn't seem useful allow overriding of bean definitions. let both beans live within spring context, , then, means of @primary annotation, spring autowire "primary" bean instance.


Comments