2011-01-10 35 views
24

Tôi có một số loại đậu cùng loại (BeanType). Làm thế nào để tiêm chúng bằng ID với chú thích? Nói:Làm cách nào để tiêm phụ thuộc Spring bằng ID?

@Autowired @ID("bean1") 
public void setBean(BeanType bean) { 
} 

Nhưng không có chú thích @ID.

Tôi chỉ tìm thấy @Qualifier điều đó có nghĩa là tôi sẽ phải cung cấp tất cả các ID đậu của mình vòng loại. Chắc chắn, có một cách đơn giản hơn?

giải pháp

Trả lời

60

đơn giản nhất là sử dụng @Resource

@Resource(name="bean1") 
public void setBean(BeanType bean) { 
} 

Ngẫu nhiên, @Qualifierđược dùng để ám chỉ đậu bằng ID để sử dụng với @Autowired, ví dụ:

@Autowired @Qualifier("bean1") 
public void setBean(BeanType bean) { 
} 

nơi bean1 là ID của đậu được tiêm.

Xem Spring manual:

Đối với một trận đấu dự phòng, tên đậu được coi là một giá trị vòng loại mặc định. Do đó, bạn có thể định nghĩa bean có id "main" thay vì phần tử vòng loại lồng nhau, dẫn đến kết quả trùng khớp giống nhau. Tuy nhiên, mặc dù bạn có thể sử dụng quy ước này để chỉ các hạt cụ thể theo tên, @Autowired về cơ bản là tiêm loại định hướng với các vòng loại ngữ nghĩa tùy chọn. Điều này có nghĩa là các giá trị vòng loại, ngay cả với tên dự phòng bean, luôn luôn có các ngữ nghĩa thu hẹp trong tập hợp các kiểu khớp; họ không ngữ nghĩa thể hiện một tham chiếu đến một id đậu duy nhất.

Nếu bạn có ý định thể hiện tiêm chú thích-driven theo tên, không chủ yếu sử dụng @Autowired, ngay cả khi là về mặt kỹ thuật có khả năng đề cập đến một tên đậu qua @Qualifier giá trị. Thay vào đó, hãy sử dụng chú thích JSR-250 @Resource, được định nghĩa ngữ nghĩa để xác định thành phần đích cụ thể theo tên duy nhất của nó, với loại được khai báo không liên quan đến quá trình khớp.

Tôi thích @Resource, nó sạch hơn (và không cụ thể theo mùa xuân).

+0

Hmm ... sau đó tôi phải làm điều gì đó sai vì @Qualifier không tìm thấy hạt .. '@ Resource' hoạt động mặc dù. Bạn có thể vui lòng kiểm tra xem '@ Qualifier' có thực sự hoạt động cho các ID không? Theo các tài liệu, nó cần một phần tử '' trong bean. –

+2

@Aaron: Hành vi của mỗi cách tiếp cận thực sự là khác nhau một cách tinh tế. Khi sử dụng '@ Qualifier' với' @ Autowired', trình định danh được sử dụng để thu hẹp các tùy chọn được trình bày bởi '@ Autowired', trong khi' @ Resource' chọn một bean một cách rõ ràng. – skaffman

+0

@Aaron: Xem chỉnh sửa – skaffman

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