2012-07-04 17 views
8

tôi gặp một chút rắc rối trong mùa xuân với hai thành phần của dịch vụ.Mùa xuân Không có hạt đậu độc đáo loại

tôi có thành phần này:

@Component 
public class SmartCardWrapper 

và một này:

@Component 
public class DummySmartCardWrapper extends SmartCardWrapper 

Các autowire dịch vụ cả nhưng mùa xuân không do Nguyện vọng này:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.cinebot.smartcard.SmartCardWrapper] is defined: expected single matching bean but found 2: [dummySmartCardWrapper, smartCardWrapper] 

Tại sao nó không sử dụng tên lớp?

+0

Hi Tobia, có vẻ như bạn nên sử dụng chú thích @Qualifier, xem liên kết: http: //static.springsource. org/spring/docs/2.5.x/reference/beans.html # beans-annotation-config – Jaiwo99

Trả lời

6

Đó là một trong những khái niệm cơ bản nhất của Spring - Inversion of Control.

Bạn không cần khai báo phụ thuộc của mình bằng cách sử dụng các loại triển khai của chúng (để tránh ghép nối với triển khai). Bạn có thể khai báo chúng bằng cách sử dụng giao diện hoặc siêu lớp thay thế, và làm cho Spring tìm thấy lớp triển khai thích hợp trong ngữ cảnh.

Nói cách khác, bean không được phân biệt bởi các lớp triển khai của chúng, vì bạn có thể muốn thay đổi lớp thực hiện của bean mà không thay đổi các bean phụ thuộc vào nó. Nếu bạn muốn phân biệt giữa các loại đậu khác nhau cùng loại, hãy sử dụng tên bean hợp lý thay thế:

@Autowired @Qualifier("smartCardWrapper") 
private SmartCardWrapper smardCardWrapper; 

@Autowired @Qualifier("dummySmartCardWrapper") 
private SmartCardWrapper dummySmardCardWrapper; 
+0

Tôi đang thử với @Service public class TestProvider thực hiện Runnable nhưng khi tôi cố gắng autowire có vẻ như Spring đang tìm kiếm một dịch vụ Runnable. .. tại sao? Làm thế nào để cho nó tìm kiếm TestProvider? – Tobia

+0

@Tobia: Không phải là [vấn đề này] (http://stackoverflow.com/questions/3754296/spring-autowire-not-behaving-as-expected/)? – axtavt

+0

Các vấn đề có vẻ giống nhau ... nhưng tôi không thể hiểu được giải pháp. Tôi muốn xác định các bean mà tôi putted @service chú thích không superclass của mình hoặc giao diện ... tôi có thể? – Tobia