Vì vậy, sau rất nhiều đào bới xung quanh tôi phát hiện ra rằng mùa xuân hỗ trợ JSR-330. JSR này định nghĩa một API đơn giản - toàn bộ thông số là nghĩa đen chỉ là API này - tiêu chuẩn hóa một số giao diện tiêm phụ thuộc, chú thích và hành vi.
Không giống như giao diện FactoryBean
của Spring javax.inject.Provider
không ném Ngoại lệ khi nhận tham chiếu bean. Hơn nữa, bạn vẫn sẽ cần phải xác định FactoryBean này ở một số nơi (đọc XML, hoặc @Configuration
lớp, và điều này là tối ưu).
Do lỗi, trong mùa xuân hiện tại 3.1.1, javax.inject.Provider không hoạt động. Nó không hoạt động trong Mùa xuân 3.1.0.
Để sử dụng nó, bạn đơn giản cần phải bao gồm jar javax.inject - nếu bạn sử dụng maven bạn có thể:
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
mùa xuân sẽ phát hiện nó, và từ thời điểm đó trên bạn có thể chỉ đơn giản là:
@Inject
Provider<MyObject> myObjectInstance;
//...
MyObject myObjectInstance.get();
như trong ví dụ Guice, vì đó là cùng một API.
Mặc dù nhận xét trước đó của tôi đối với Konstantin, Spring tự tạo Nhà cung cấp. (Tôi đã thử nghiệm nó chống lại mùa xuân 3.1.1 và chạy vào đây Spring Provider regression issue)
Nguồn
2012-05-11 08:48:56
+1 Câu trả lời hay. –
Tôi lo ngại có sự khác biệt đáng kể giữa Nhà cung cấp <> và Instance <> (hy vọng tôi sai). Thứ nhất: Instance triển khai Iterable và điều này có tác động lớn đến cách bạn sử dụng nó. Ví dụ. sử dụng thường xuyên cho tôi là khai báo @Inject Instance xxx ... vì vậy tôi sẽ có thể lặp qua các phiên bản của mỗi lớp thực hiện giao diện mà không biết classname. Tôi sẽ muốn biết làm thế nào để làm điều này bằng cách sử dụng nhà cung cấp. –
Rafael
'Instance <>' không phải là một phần của JSR-330, và cũng không phải là một phần của Spring. Các vấn đề mà tôi đã có lúc đó là để có được đậu nguyên mẫu (mà phụ thuộc vào một số biến ngữ cảnh) mà không nhận được một tổ chức trên applicationContext chính nó. –