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
Post a Comment