2013-08-19 70 views
17

Tôi đang di chuyển một ứng dụng sang Java EE 7 và muốn CDI 1.1. Nhưng tôi không hiểu ý nghĩa của bean-discovery-mode="annotated". Các CDI 1.1 specification không phải là rất hữu ích. Ít nhất tôi đã không tìm thấy bất kỳ đoạn hữu ích nào. Tôi đã bỏ lỡ nó?Ý nghĩa chế độ khám phá đậu được chú thích trong CDI 1.1

dụ này chạy hoàn hảo với bean-discovery-mode="all" và tiêm nhiễm một thể hiện của LoggingClass:

public class LoggingClass { 
    public Logger logger = Logger.getLogger("ALOGGER"); 

} 

@Test 
public class MMLoggerProducerIT extends Arquillian { 

    @Inject private LoggingClass lc; 

} 

Nhưng nếu tôi thay đổi bean-discovery-mode="all"-bean-discovery-mode="annotated" container không có khả năng tiêm một thể vào trường lc.

Tôi làm cách nào để chú thích LoggingClass để sử dụng bean-discovery-mode="annotated" chính xác?

+0

Tôi chỉ đoán, nhưng tôi nghĩ '@Named' hoặc '' @ManagedBean 'sẽ là ứng cử viên? –

+1

@Mike_Braun Được đặt tên sẽ chỉ hiển thị một hạt trong ngữ cảnh EL nhưng sẽ không cho nó phạm vi. ManagedBean là một chú thích JSF, công cụ CDI sẽ bỏ qua nó. – Yuri

Trả lời

27

Thực tế, bean-discovery-mode="ALL" sẽ bật tính năng quét tất cả các lớp trong bản lưu trữ. Đây được gọi là "kho lưu trữ rõ ràng".

Bỏ qua beans.xml hoặc đặt bean-discovery-mode="ANNOTATED", lưu trữ lưu trữ ẩn. Trong trường hợp này, vùng chứa sẽ quét tìm các bean với các loại phạm vi được chú thích.

Điều này giải thích tại sao LoggingClass không được tiêm khi bạn đặt bean-discovery-mode="ANNOTATED". Theo tài liệu trong Hướng dẫn Java EE 7:

CDI chỉ có thể quản lý và chèn các hạt được chú thích với loại phạm vi trong bản lưu trữ ẩn.

Chỉnh sửa: vì vậy, để hoàn toàn rõ ràng, bạn cần thêm loại phạm vi vào LoggingClass. Vì vậy, một cái gì đó như thế này:

@SessionScoped 
public class LoggingClass { 
    public Logger logger = Logger.getLogger("ALOGGER"); 
} 

Trong Java EE 7 và CDI 1.1, chúng tôi loại bỏ các yêu cầu để bao gồm các mô tả beans.xml triển khai để bật CDI cho một kho lưu trữ, mang CDI 1.1 phù hợp với hầu hết các API Java EE khác nơi mô tả triển khai là tùy chọn. Nó cũng loại bỏ bản chất bật/tắt nhị phân bao gồm beans.xml hay không. Bạn có thể kiểm soát tệp nào được vùng chứa quét bằng cài đặt trong bean-discovery-mode.

Xem hướng dẫn JavaEE về đóng gói ứng dụng CDI ở đây: http://docs.oracle.com/javaee/7/tutorial/cdi-adv001.htm#CACDCFDE

+0

Nếu không có 'beans.xml', các Trình chặn và Trang trí được đăng ký và đặt hàng như thế nào? Là có một cách? – noinstance

+1

@nosuchnick Thiết bị chặn có thể được đặt hàng qua chú thích bằng cách sử dụng '@ Interceptors' và' @ Priority', như được mô tả [trong phần 54.2.5 tại đây] (http://docs.oracle.com/javaee/7/tutorial/doc/interceptors002 .htm # GKHNI). –

+0

nó mô tả cách để @Produces hoạt động? Có một chú thích tôi phải đưa vào lớp Nhà máy? –

23

Khi sử dụng bean-discovery-mode="annotated" chỉ lớp học với một đậu xác định chú thíchare discovered. Tất cả các lớp khác đều bị bỏ qua. Bất kỳ loại phạm vi nào là chú thích xác định bean. Nếu một loại phạm vi được khai báo trên một lớp bean, thì lớp bean được cho là có chú thích xác định bean [spec]. Thông số 1.1 không hoàn toàn rõ ràng ở đây. Chỉ các lớp có phạm vi @NormalScope hoặc @Dependent phạm vi giả mới được phát hiện, @javax.inject.Singleton và tất cả các khác @Scope (giả) phạm vi are ignored.

Lưu ý rằng định nghĩa của "chú thích xác định bean" đã thay đổi trong CDI 1.2 và hiện đang rất được xác định rõ:

Tập hợp các chú thích xác định đậu chứa:

  • @ApplicationScoped, @SessionScoped, @ConversationScoped và @RequestScoped chú thích,
  • tất cả các loại phạm vi bình thường khác,
  • Chú thích @Interceptor và @Decorator,
  • chú thích khuôn mẫu (tức là chú thích được chú thích với @Stereotype), và chú thích phạm vi @Dependent.
+1

đây phải là câu trả lời được chấp nhận. – Chris