2010-01-28 36 views
48

Tôi thích tiêm xây dựng dựa trên vì nó cho phép tôi tạo các trường được tiêm final. Tôi cũng thích tiêm hướng chú thích vì nó đơn giản hóa context.xml của tôi. Tôi có thể đánh dấu hàm tạo của mình bằng @Autowired và mọi thứ đều hoạt động tốt, miễn là tôi không có hai thông số cùng loại. Ví dụ, tôi có một lớp:Mùa xuân - tiêm 2 hạt cùng loại

@Component 
public class SomeClass { 
    @Autowired(required=true) 
    public SomeClass(OtherClass bean1, OtherClass bean2) { 
     … 
    } 
} 

và một bối cảnh ứng dụng với:

<bean id="bean1" class="OtherClass" /> 
<bean id="bean2" class="OtherClass" /> 

Nên có một cách để chỉ định ID đậu vào constructor của lớp SomeClass, nhưng tôi có thể' t tìm thấy nó trong tài liệu. Có thể, hay tôi đang mơ về một giải pháp chưa tồn tại?

Trả lời

72

@Autowired là theo loại (trong trường hợp này); sử dụng @Qualifier để autowire by-tên, làm theo tấm gương from spring docs:

public SomeClass(
    @Qualifier("bean1") OtherClass bean1, 
    @Qualifier("bean2") OtherClass bean2) { 
    ... 
} 

Lưu ý: Ngược lại với @Autowired đó là áp dụng đối với các lĩnh vực, nhà thầu và các phương pháp đa đối số (cho phép thu hẹp thông qua các chú thích vòng loại tại cấp độ tham số), @Resource chỉ được hỗ trợ cho các trường và các phương thức thiết lập thuộc tính bean với một đối số duy nhất. Kết quả là, gắn bó với vòng loại nếu mục tiêu tiêm của bạn là một hàm tạo hoặc một phương thức đa đối số.

(bên dưới văn bản đó là đầy đủ các ví dụ)

+2

'@ Autowire' là bởi tên tuổi quá, nhưng trong trường hợp đó bạn cần cung cấp setters. Nhưng ở đây các đối số hàm tạo được ưu tiên và '@ Autowire' sẽ không hoạt động nếu cả hai args đều có cùng kiểu. Do đó, điều có thể được giải quyết bằng cách sử dụng '@ Qualifier'. –

+0

làm rõ câu trả lời. – Bozho

+0

Noticed ....... + 1 –

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