Chú thích javax.inject.Named được sử dụng để làm gì?


113

Tôi đang cố gắng hiểu javax.injectgói và tôi không rõ javax.inject.Namedchú thích được sử dụng để làm gì. Javadoc không giải thích ý tưởng đằng sau nó.

Javadoc có tại http://download.oracle.com/javaee/6/api/javax/inject/Named.html

Tôi đang sử dụng Spring 3.0 để viết một số chương trình mẫu, bằng cách đặt @Namedmột bean có vẻ như thêm nó vào bean factory nhưng mô tả Javadoc quá nhẹ nên tôi không thể biết đó là hành vi tiêu chuẩn hay hành vi cụ thể của Spring.

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 phải nói với hệ thống Runtime một lớp nên được đưa vào các lớp khác, chú thích cho điều đó là gì? Tương đương với @Componenttrong mùa xuân?

Cập nhật 1 có một lời giải thích tuyệt vời @Named@Qualifiertại bài viết Nice về @Named@Qualifier https://dzone.com/articles/java-ee6-cdi-name-components, cảm ơn @xmedeko đã liên kết đến nó, bình luận bên dưới.


Cấu hình của JSR-330 nằm ngoài thông số kỹ thuật, tức là vùng chứa cụ thể.
Thorbjørn Ravn Andersen

1
Theo tài liệu Spring "Chú thích @Named của JSR 330 có thể được sử dụng như một phương tiện để phát hiện các thành phần và cung cấp tên cho chúng. Hành vi này được bật tự động nếu bạn có JSR 330 JAR trên classpath." hành vi này là duy nhất cho mùa xuân hay cho tất cả các vùng chứa hiểu @Named?
ams

Câu trả lời:


87

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

@Named("maxWaitTime")
public long maxWaitTimeMs;

@Named("minWaitTime")
public long minWaitTimeMs;

Nếu không có bộ định lượng @Named, bộ phun sẽ không biết thời gian liên kết với biến nào.

  • Nếu bạn muốn tạo chú thích hoạt động như vậy @Named, hãy sử dụng @Qualifierchú thích khi tạo chúng.

  • Nếu bạn nhìn vào @Named, bản thân nó được chú thích bằng @Qualifier.


Vì vậy, @Named thực sự là @Qualifier, vậy tại sao @Qualifier lại bắt buộc phải chung chung như vậy, ý 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

Tôi không chắc bạn muốn nói gì về khuôn mẫu. 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

Ví dụ: thay vì @Named ("maxWaitTime"), bạn có thể có @MaxWaitTime. Nó chỉ sạch hơn một chút.
nguồn gốc từ

28
Đẹp bài viết về @Named@Qualifier java.dzone.com/articles/java-ee6-cdi-named-components
xmedeko

Tôi không hiểu ... bạn không thể phân biệt giữa chúng bằng các tên biến khác nhau?
CodyBugstein

64

@Injectthay vì Spring @Autowiredđể tiêm một hạt đậu.
@Namedthay vì Spring's @Componentđể khai báo một bean.

Các chú thích chuẩn JSR-330 đó được quét và truy xuất theo cách giống như chú thích Spring (miễn là phần sau jarnằm trong classpath của bạn)


Cụm từ "tiêm một hạt đậu" là mơ hồ; ý bạn là "thỏa mãn tất cả các phụ thuộc của bean đó" hay là "tiêm bean đó vào một thứ có nó làm phụ thuộc"?
Andrew Swan

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

tiêm một hạt đậu - "tiêm hạt đậu đó vào thứ gì đó có nó như một thứ phụ thuộc"
Nadav Kết thúc

Tôi xin lỗi Pawan, tôi không quen với danh sách JSR tương ứng với chú thích mùa xuân
Nadav Kết thúc

8

Về số 2, theo thông số JSR-330:

Gói này cung cấp các chú thích chèn phụ thuộc cho phép các lớp di động, nhưng nó để lại cấu hình phụ thuộc bên ngoài cho đến khi triển khai bộ 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 nó là tất cả đậ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.


5

Vai trò chính của chú thích @Named là xác định một bean nhằm mục đích giải quyết các câu lệnh EL trong ứng dụng, thường thông qua các trình phân giải JSF EL. Việc 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 trong CDI hoạt động vì CDI cung cấp cho chúng ta một cách phong phú hơn nhiều để thể hiện điểm tiêm và hạt đậu được tiêm vào chúng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.