2010-12-30 35 views
12
@Service @Order(1) 
public class FooService implements IService {..} 

@Service @Order(2) 
public class BarService implements IService {..} 

Có đảm bảo rằng thứ tự trong danh sách sau sẽ luôn luôn được {FooService, BarService}:Khi tiêm một danh sách các loại đậu, là thứ tự trong danh sách tương tự như trình tự quy định của đậu

@Inject 
private List<IService> services; 

(cùng một câu hỏi cho cấu hình xml)

+1

Tôi chỉ cố gắng truy tìm này qua mùa xuân mã nguồn, nhưng nó khá đáng sợ trong đó, và tôi không thể theo nó đủ xa. Tôi nghi ngờ câu trả lời là "có", mặc dù. – skaffman

+0

@skaffman Đó là hành vi hợp lý nhất, và đưa ra 'chính sách' bình thường của mùa xuân về vấn đề đó, tôi cũng nghi ngờ "có". Nhưng tôi sẽ cố gắng tìm một bằng chứng :) – Bozho

+0

@skaffman - có vẻ như kỳ vọng của chúng tôi là sai;) (xem câu trả lời và ý kiến ​​của axtavt dưới đây) – Bozho

Trả lời

11

Tôi đoán không vì @Order không phải là chú thích mục đích chung. Từ javadoc:

LƯU Ý: Chỉ định chú thích được hỗ trợ cho các loại thành phần cụ thể, ví dụ: cho các khía cạnh AspectJ dựa trên chú thích. Mặt khác, các chiến lược vùng chứa Spring thường dựa trên giao diện Ordered để cho phép thứ tự cấu hình của mỗi thể hiện.

Cũng không có lần xuất hiện của org.springframework.core.annotation.OrderAnnotationAwareOrderComparator trong nguồn của beanscontext mô-đun.

Một cách đơn giản để làm điều này như mong đợi là:

@PostConstruct 
public void init() { 
    Collections.sort(services, AnnotationAwareOrderComparator.INSTANCE); 
} 
+0

Và vì vậy, nếu tôi thực hiện 'Ordered', họ sẽ được đặt hàng đúng cách trong danh sách? – Bozho

+0

@Bozho: Tôi nghĩ rằng 'Ordered' không thể giúp quá - có vẻ như' OrderComparator' chỉ được sử dụng để đặt hàng các loại đậu đặc biệt như các bộ xử lý sau. – axtavt

+0

Đã kiểm tra và thử nghiệm đã chứng minh bạn đã chính xác. Đã chấp nhận câu trả lời và thêm một giải pháp cho nó (nếu bạn không đồng ý với nó, hãy xóa nó đi :)). – Bozho

3

Kể từ khi phát hành mùa xuân 4, việc sử dụng @Order đã được mở rộng để bao gồm @Component

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