2013-07-30 23 views
10

Đối với một POJO đơn giản:Mùa xuân - @Primary không thành công với @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; 
    } 
} 

và cấu hình này

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

tôi mong chờ các thử nghiệm sau

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

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

để in ra Primary Bean!! nhưng nó sẽ trả về Secondary ComponentScan?? thay vì ...

Cách c ome? Không có tài liệu nào cho số @Primary nói rằng nó không thành công đối với các hạt được quét thành phần!

Trả lời

15

Lý do là cả hai hạt thực sự có cùng tên foo, do đó, một định nghĩa bean nội bộ sẽ bị ghi đè bằng một định nghĩa khác, về cơ bản là một với @Bean bị ghi đè bởi một cái đang được quét bởi @ComponentScan.

Việc sửa chữa chỉ đơn giản là để cung cấp cho một trong số họ một tên khác nhau và bạn sẽ thấy hành vi chính xác của đậu @Primary nhận được tiêm.

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

HOẶC

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

Bạn đã cứu sống tôi! = p –

Các vấn đề liên quan