2011-08-22 19 views
509

Tôi sẽ thông qua một số blog trên SpringSource và trong một trong những tác giả blog đang sử dụng @Inject và tôi cho rằng ông cũng có thể sử dụng @AutowiredSự khác nhau giữa @Inject và @Autowired trong Spring Framework là gì? Cái nào để sử dụng dưới điều kiện nào?

Dưới đây là đoạn mã:

@Inject private CustomerOrderService customerOrderService;

Tôi không chắc chắn về sự khác biệt giữa @Inject@Autowired và sẽ đánh giá cao nếu ai đó có thể giải thích sự khác biệt và cái nào để sử dụng trong tình huống nào?

+2

Tôi không có câu trả lời, vì tôi cũng mới, nhưng điều này có thể giúp http://sakaenakajima.wordpress.com/2010/08/10/spring-3-annotation-autowired-and- tiêm/ –

+0

Nhân bản: http://stackoverflow.com/questions/13657787/import-custom-java-class – RustyShackleford

+2

Sự khác biệt giữa '@Inject' và '@Autowired' được giải thích rõ trong bài viết này https: // alextheedom. wordpress.com/2016/02/13/insights-from-stackoverflow-most-bình chọn-cho-spring-4-questions/# 3 – Alex

Trả lời

538

Giả sử ở đây bạn đang đề cập đến chú thích javax.inject.Inject. @Inject là một phần của tiêu chuẩn Java CDI (Contexts and Dependency Injection) được giới thiệu trong Java EE 6 (JSR-299), read more. Mùa xuân đã chọn hỗ trợ sử dụng @Inject đồng nghĩa với chú thích @Autowired của riêng chúng.

Vì vậy, để trả lời câu hỏi của bạn, @Autowired là chú thích (cũ) của riêng Spring. @Inject là một phần của công nghệ Java mới được gọi là CDI xác định tiêu chuẩn cho việc tiêm phụ thuộc tương tự như Spring. Trong một ứng dụng Spring, hai chú thích hoạt động giống như cách Spring đã quyết định hỗ trợ một số chú thích JSR-299 ngoài các chú thích của riêng chúng.

+86

Vì vậy, về mặt lý thuyết nếu bạn sử dụng @Inject, bạn có thể thay thế mùa xuân bằng một khung DI khác, ví dụ: Guice và tiêm phụ thuộc của bạn trong cùng một cách. –

+54

Có nguy cơ bị lỗi: '@ Inject' là một JSR riêng biệt (JSR-330) từ CDI (JSR-299). –

+16

Nếu bạn chỉ dựa vào chú thích JSR- *, chắc chắn, bạn * có thể * thay thế khung DI của bạn. Nhưng bạn sẽ? Một khi bạn đã bắt đầu sử dụng mùa xuân, rất có thể bạn đã sử dụng nhiều hơn nó chỉ là DI. Bạn sẽ không chỉ thay đổi; và thậm chí nếu bạn làm, nó không phải là một vài tìm kiếm và thay thế đó là sẽ thực hiện hoặc phá vỡ di chuyển. Mặt khác, chú thích của Spring cung cấp cho bạn nhiều chức năng hơn. Nắm vững một khuôn khổ tốt sẽ cung cấp cho bạn nhiều hơn hầu như không sử dụng nhiều. –

135

Đây là số blog post so sánh @Resource, @Inject@Autowired và dường như làm một công việc khá toàn diện.

Từ liên kết:

Với ngoại lệ của thử nghiệm 2 & 7 cấu hình và kết quả là giống hệt nhau. Khi tôi nhìn bên dưới mui xe, tôi đã xác định rằng chú thích '@Autowired' và ‘@Inject’ ' ' hoạt động giống hệt nhau. Cả hai các chú thích này đều sử dụng tùy chọn ‘AutowiredAnnotationBeanPostProcessor’ để tiêm phụ thuộc. ‘@Autowired’ và ‘@Inject’ có thể được sử dụng có thể hoán đổi cho nhau để chèn hạt đậu mùa xuân. Tuy nhiên, chú thích ‘@Resource’ sử dụng ‘CommonAnnotationBeanPostProcessor’ để tiêm các phụ thuộc . Mặc dù họ sử dụng các lớp xử lý bài đăng khác nhau nhưng tất cả chúng đều hoạt động gần như giống nhau. Dưới đây là tóm tắt về các đường dẫn thực hiện của chúng.

Kiểm tra 2 và 7 mà tác giả tham chiếu là 'tiêm theo tên trường' và 'cố gắng giải quyết bean bằng cách sử dụng trình phân loại xấu' tương ứng.

Kết luận sẽ cung cấp cho bạn tất cả thông tin bạn cần.

+3

Bài viết đó là một lời giải thích tuyệt vời về ba chú thích. Tôi đã phải đọc lại nó sau lần vuốt đầu tiên; nhưng, một bài viết tuyệt vời. – Thomas

+1

Cảm ơn rất nhiều! Bài viết đã trả lời nhiều câu trả lời của tôi trong tìm kiếm của tôi về việc tìm ra sự khác biệt và tương đồng giữa Spring và JavaEE, cũng như một vài câu hỏi khác mà tôi có. –

25

Để xử lý tình huống không có hệ thống dây điện, hạt có sẵn với @Autowiredrequired thuộc tính được đặt thành false.

Nhưng khi sử dụng @Inject, giao diện nhà cung cấp làm việc với bean có nghĩa là hạt không được tiêm trực tiếp nhưng với nhà cung cấp.

+4

Điều này rất quan trọng và đã bị bỏ qua trong các câu trả lời được tán thành nhiều nhất. –

+0

Theo tham số bắt buộc mặc định được đặt thành true cho Autowired. Tham khảo: http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/factory/annotation/Autowired.html – tranquil

22

Tính đến mùa xuân 3.0, Spring cung cấp hỗ trợ cho chú thích tiêm phụ thuộc JSR-330 (@Inject, @Named, @Singleton).

Có một số separate section in the Spring documentation về chúng, bao gồm so sánh với tương đương mùa xuân của chúng.

+0

Câu hỏi ở đây, ý bạn là gì khi bạn nói Spring hỗ trợ JSR? Vùng chứa có hỗ trợ JSR độc lập với Spring hay không và một yêu cầu cho container có tuân thủ J2EE không? Bạn có nghĩa là nó kết thúc tốt đẹp chức năng? Nếu Spring không "hỗ trợ" nó, không phải chú thích từ javax vẫn hoạt động theo mặc định? –

+0

Không nhất thiết phải chạy Spring trong một thùng chứa JEE, bạn cũng có thể sử dụng nó trong một thùng chứa servlet/JSP như Tomcat và vẫn có sự hỗ trợ JSR-330. Spring là một thùng chứa DI riêng biệt, nó không "trao đổi" các hạt CDI với máy chủ JEE chủ nếu nó là ý của bạn. Bạn có thể sử dụng CDI trong một thùng chứa JEE hoặc các bean Spring - nhưng bạn không thể sử dụng cả hai (ngoài hộp). –

11

@Inject không có 'cần thiết' thuộc tính

9

Ngoài các phần trên:

  1. Phạm vi mặc định cho @Autowired đậu là Singleton trong khi sử dụng JSR 330 chú thích @Inject nó cũng giống như mùa xuân của prototype.
  2. Không có tương đương với @Lazy trong JSR 330 sử dụng @Inject
  3. Không có tương đương với @value trong JSR 330 sử dụng @Inject
10

@Autowired chú thích được định nghĩa trong khuôn khổ mùa xuân.

@Inject chú thích là chú thích chuẩn, được xác định trong tiêu chuẩn "Dependency Injection for Java" (JSR-330). Spring (kể từ phiên bản 3.0) hỗ trợ mô hình tổng quát về tiêm phụ thuộc được định nghĩa trong tiêu chuẩn JSR-330. (Google Guice frameworksPicocontainer framework cũng hỗ trợ mô hình này).

Với @Inject có thể được tiêm tham chiếu đến việc triển khai giao diện Provider, cho phép chèn tham chiếu bị trì hoãn.

Chú thích @Inject@Autowired - gần như hoàn toàn tương tự. Cũng như chú thích @Autowired, chú thích @Inject có thể được sử dụng cho các thuộc tính ràng buộc tự động, các phương thức và các hàm tạo.

Ngược lại với chú thích @Autowired, chú thích @Inject không có thuộc tính required. Vì vậy, nếu các phụ thuộc sẽ không được tìm thấy - sẽ được ném ngoại lệ.

Ngoài ra còn có sự khác biệt trong việc làm rõ các thuộc tính ràng buộc. Nếu có sự mơ hồ trong việc lựa chọn các thành phần cho việc tiêm, thì cần thêm một loại vòng loại @Named. Trong một tình huống tương tự cho chú thích @Autowired sẽ được thêm @Qualifier vòng loại (JSR-330 xác định chú thích @Qualifier riêng của nó và thông qua chú thích định danh này @Named được xác định).

+0

Mặc dù '@Inject' không có thuộc tính bắt buộc, trạng thái Java Documents: Cần phải tiêm các thành viên được chú thích bằng '@Inject'. Mà dường như ngụ ý rằng nếu một thành viên không tìm thấy tiêm của nó sẽ thất bại. Xem Tài liệu Java: http://docs.oracle.com/javaee/7/api/javax/inject/Inject.html – Alex

14

Sự khác biệt quan trọng chính (chú ý khi đọc Spring Docs) giữa cả hai @Autowired@Inject là, @Autowired có thuộc tính 'bắt buộc' trong khi @Inject không có thuộc tính 'bắt buộc'.

+0

ý của bạn là gì? – mattymanme

+2

@mattymanme Từ các tài liệu, _ "Theo mặc định, autowiring không thành công bất cứ khi nào không có ứng cử viên đậu có sẵn, hành vi mặc định là để điều trị chú thích phương pháp, nhà xây dựng, và các lĩnh vực như chỉ ra yêu cầu phụ thuộc. Hành vi này có thể được thay đổi bằng cách thiết lập các thuộc tính cần thiết false "._ Ví dụ:' @Autowired (required = false) '.Trong thuật ngữ đơn giản, _" Thuộc tính 'required' chỉ ra rằng thuộc tính không bắt buộc cho mục đích autowiring, thuộc tính bị bỏ qua nếu nó không thể được autowired." _ – Lucky

+0

tìm mã nguồn giao diện công cộng Tự động { \t/** \t * Tuyên bố xem phụ thuộc có chú thích là bắt buộc hay không. \t */ \t boolean required() mặc định là true; } giao diện công cộng Tiêm {} – tarn

9

Sử dụng tốt hơn @Inject mọi lúc. Bởi vì nó là phương pháp cấu hình java (được cung cấp bởi ánh nắng mặt trời), điều này làm cho ứng dụng của chúng ta trở nên bất khả tri đối với khung công tác. Vì vậy, nếu bạn mùa xuân cũng các lớp học của bạn sẽ làm việc.

Nếu bạn sử dụng @Autowired nó sẽ chỉ hoạt động với mùa xuân vì @Autowired là mùa xuân cung cấp chú thích.

+8

Mặt trời đã chết. Long sống mặt trời. –

+2

tần suất bạn sẽ thay đổi khung công tác? chỉ tò mò – Kay