2011-03-24 38 views
81

Tôi đang cố gắng hiểu gói javax.inject và tôi không rõ ý nghĩa của chú thích javax.inject.Named là gì. Javadoc không giải thích ý tưởng đằng sau nó.Chú thích javax.inject.Name được sử dụng là gì?

Javadoc là http://download.oracle.com/javaee/6/api/javax/inject/Named.html

Tôi đang sử dụng mùa xuân 3,0 để viết một số chương trình mẫu, bằng cách đặt @Named trên một bean có vẻ như để thêm nó vào bean factory nhưng mô tả Javadoc rất nhẹ Tôi có thể' t cho biết đó là hành vi tiêu chuẩn hoặc hành vi cụ thể của mùa xuân.

Câu hỏi của tôi là:

  1. sự khác biệt giữa @Named@Qualifier
  2. Làm thế nào bạn có nghĩa vụ để yêu cầu hệ thống Runtime một lớp nên được tiêm ở các lớp khác chú thích cho đó là những gì là gì? Tương đương với @Component vào mùa xuân?

Cập nhật 1 có một lời giải thích tuyệt vời của @Named@Qualifier tại Nice bài viết về @Named@Qualifierhttp://java.dzone.com/articles/java-ee6-cdi-named-components nhờ @xmedeko để liên kết để nó trở thành bình luận dưới đây.

+0

Cấu hình của JSR-330 nằm ngoài thông số kỹ thuật, ví dụ: thùng chứa cụ thể. –

+1

Theo tài liệu Spring "JSR 330's @Named chú thích có thể được sử dụng như một phương tiện để phát hiện cả hai thành phần và cung cấp cho họ một tên. Hành vi này được kích hoạt tự động nếu bạn có JSR 330 JAR trên classpath." hành vi này có độc đáo đối với mùa xuân hoặc cho tất cả các vùng chứa hiểu @Named không? – ams

Trả lời

54

Sử dụng @Named để phân biệt giữa các đối tượng khác nhau cùng loại bị ràng buộc trong cùng phạm vi.

@Named("maxWaitTime") 
public long maxWaitTimeMs; 

@Named("minWaitTime") 
public long minWaitTimeMs; 

Nếu không có bộ định danh @Named, người phun sẽ không biết phải gắn bó với biến nào lâu.

Nếu bạn muốn tạo chú thích hoạt động như @Named, hãy sử dụng chú thích @Qualifier khi tạo chú thích. Nếu bạn nhìn vào @Named, nó tự nó được chú thích với @Qualifier.

+0

Vì vậy, @Named thực sự là @Qualifier, vậy tại sao @Qualifier được yêu cầu là chung chung, là ý tưởng cho phép ai đó sử dụng javax.inject để xác định các khuôn mẫu như @ Repository, @ Service, @ Controller được đánh dấu là @Qualifier? – ams

+0

Tôi không chắc chắn ý của bạn về các định kiến. Nếu bạn muốn thêm chú thích mới để phân biệt giữa các trường hợp khác nhau của cùng một Loại, thì có. – sbridges

+0

Ví dụ thay vì @Named ("maxWaitTime") bạn có thể có @MaxWaitTime. Nó chỉ là một chút sạch hơn. – sourcedelica

7

Về # 2, theo JSR-330 spec:

Gói này cung cấp phụ thuộc chú thích tiêm cho phép lớp di động, nhưng nó để lại cấu hình phụ thuộc bên ngoài lên đến việc thực hiện phun.

Vì vậy, tùy thuộc vào nhà cung cấp để xác định đối tượng nào có sẵn để tiêm. Trong trường hợp của mùa xuân, đó là tất cả các loại đậu mùa xuân. Và bất kỳ lớp nào được chú thích bằng chú thích JSR-330 sẽ tự động được thêm vào dưới dạng Spring bean khi sử dụng AnnotationConfigApplicationContext.

31

@Inject thay vì Spring’s @Autowired để tiêm đậu.
@Nam thay vì @Component của Spring để khai báo một bean.
Các chú thích chuẩn JSR-330 đó được quét và truy xuất giống như chú thích Spring (miễn là jar sau nằm trong đường dẫn lớp của bạn)

+0

Cụm từ "inject a bean" không rõ ràng; bạn có nghĩa là "đáp ứng tất cả các phụ thuộc của bean" hay bạn có nghĩa là "tiêm đậu đó vào thứ gì đó có nó như là một phụ thuộc"? –

+0

Tôi có thể tìm danh sách các đối tác JSR để chú thích mùa xuân ở đâu? – Pawan

+0

tiêm đậu - "bơm đậu đó vào thứ gì đó có nó như là một phụ thuộc" –

2

Vai trò chính của chú thích @Nam là xác định bean cho mục đích giải quyết các câu lệnh EL trong ứng dụng, thường là thông qua các giải pháp của JSF EL.Tiêm có thể được thực hiện bằng cách sử dụng tên, nhưng đây không phải là cách tiêm CDI có nghĩa là làm việc vì CDI cho chúng ta một cách phong phú hơn để thể hiện các điểm tiêm và đậu được tiêm vào chúng.

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