2013-07-30 18 views
10

Dla prostego POJO:Spring - @Primary nie działa przeciwko @ComponentScan?

@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; 
    } 
} 

i tej konfiguracji

@Configuration 
@ComponentScan(basePackageClasses = Foo.class) 
public class TestConfiguration 
{ 
    @Primary 
    @Bean 
    public Foo foo() 
    { 
     return new Foo("Primary bean!!"); 
    } 
} 

spodziewałbym następujący test

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = TestConfiguration.class) 
public class Test 
{ 
    @Autowired 
    private Foo foo; 

    @Test 
    public void test() 
    { 
     System.out.println(foo); 
    } 
} 

wydrukować Primary Bean!! ale zwraca Secondary ComponentScan?? zamiast ...

How c ome? Nigdzie dokumentacja dla @Primary nie powiedzie się przeciwko komponentom zeskanowanym fasolom!

Odpowiedz

15

Powodem jest to, że oba fasola rzeczywiście mają taką samą nazwę foo, tak wewnętrznie jedna definicja fasola jest uzyskiwanie nadpisane z drugą, w zasadzie jeden z @Bean jest uzyskiwanie nadpisane przez jednego skanowanego przez @ComponentScan.

Poprawka polega po prostu na nadaniu jednej z nich innej nazwy i powinno zostać wyświetlone prawidłowe zachowanie fasoli @Primary.

@Primary 
@Bean 
public Foo foo1() 
{ 
    return new Foo("Primary bean!!"); 
} 

LUB

@Component("foo1") 
public class Foo 
{ 
.. 
+2

Uratowałeś mi życie! = p –