2013-05-22 29 views
6

Tại sao Spring tự động chọn loại siêu lớp trong khi tự động phát?Siêu lớp mùa xuân tự động

Ví dụ, nếu tôi có

@Component 
public class Foo {} 

@Component 
public class Bar extends Foo {} 

và ai đó autowires

@Autowired 
private Foo foo; 

Tại sao mùa xuân luôn chọn supertype Foo? Đây có phải là một "" không rõ ràng "ánh xạ (và gây ra Mùa xuân để ném một lỗi)?

Bạn có kỹ thuật không haiFoo ứng cử viên? (ví dụ: Bar được tự động chọn khi @Component bị xóa khỏi Foo ...)

Trả lời

9

Điều đó có thể do việc tự động thực hiện theo tên chứ không phải loại. Nếu tôi thiết lập đậu của tôi sử dụng xml như thế này:

<bean id="foo1" class="Foo"/> 
<bean id="foo2" class="Bar"/> 

Và cố gắng autowire theo loại:

@Autowired private Foo aFoo; 

tôi nhận được

org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [Foo] 
3

Tự động có thể hoạt động bằng cả loại và tên bean, tùy thuộc vào cách bạn định cấu hình.

Trong trường hợp này, vì có hai loại hạt Foo, ví dụ Foo có thể được chọn vì nó khớp với tên của biến số foo.

Điều gì sẽ xảy ra nếu bạn đổi tên foo thành thứ gì đó khác?

3

Nếu có hai đậu của cùng loại, sau đó spring cố gắng giải quyết sự phụ thuộc bằng tên của biến mà bạn đã chỉ định. Nếu tên không khớp với bất kỳ tên bean nào, thì nó sẽ ném một lỗi. Tuy nhiên, nếu nó tìm thấy một tên bean phù hợp với tên của biến mà bạn đã chỉ định, nó sẽ tiêm đậu đó. Vì vậy, trong khi tiêm phụ thuộc, mùa xuân xem xét cả hai, loại và tên.