Spring - @Primary fails against @ComponentScan?
configuration, java, spring, spring-test, testing
Solution
The reason is that both beans actually have the same name `foo`, so internally one bean definition is getting overridden with the other one, essentially the one with `@Bean` is getting overridden by the one being scanned by `@ComponentScan`.
The fix is simply to give one of them a different name and you should see the correct behavior of the `@Primary` bean getting injected.
@Primary
@Bean
public Foo foo1()
{
return new Foo("Primary bean!!");
}
OR
@Component("foo1")
public class Foo
{
..
Problem
For a simple POJO: ``` @Component public class Foo { private final String string; public Foo() { this("Secondary ComponentScan??"); } public Foo(String string) { this.string = string; } @Override public String toString() { return string; } } ``` and this configuration ``` @Configuration @ComponentScan(basePackageClasses = Foo.class) public class TestConfiguration { @Primary @Bean public Foo foo() { return new Foo("Primary bean!!"); } } ``` I would expect the following test ``` @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = TestConfiguration.class) public class Test { @Autowired private Foo foo; @Test public void test() { System.out.println(foo); } } ``` to print out `Primary Bean!!` but it returns `Secondary ComponentScan??` instead... How come? Nowhere does the documentation for @Primary say it fails against component-scanned beans!