2010-01-18 24 views
9

Có hai cách tôi biết để có được một thể hiện EJB: dependency injectionEJB3 - lấy đậu thông qua tiêm vs tra cứu - sự khác biệt, tác động, gotchas là gì?

  • trong servlets và EJB qua chú thích @EJB
  • JNDI tra cứu qua Context.lookup bất cứ nơi nào

là gì sự khác biệt, hàm ý và gotchas trong việc sử dụng một trong các cách tiếp cận này? Họ có giống nhau không? Là phụ thuộc tiêm nhanh hơn tra cứu? Điều gì về xử lý giao dịch và quản lý vòng đời đối tượng?

Những điều tôi biết bao gồm:

chú thích

  • làm việc với servlets và và EJB chỉ
  • cú pháp thuận tiện
  • chứa độc lập

tra cứu

  • có thể khởi tạo các triển khai khác nhau của giao diện EJB theo chương trình tại thời gian chạy.
  • hoạt động ở mọi nơi - ví dụ: POJO.
  • phụ thuộc vào quy ước đặt tên của container

Trả lời

2

Lookup phụ thuộc vào sự hiện diện thực hiện JNDI, có nghĩa là, bạn phải cấu hình thực hiện JNDI để chạy thử nghiệm đơn vị, lĩnh vực sau đó chú thích có thể được cấu hình bằng tay.

6

Cả hai đều đạt được kết quả tương tự. Đó là vấn đề của khớp nối. Với chú thích, bạn đạt được khớp nối lỏng lẻo và dễ dàng hơn để thử nghiệm và thử nghiệm. Với tra cứu trực tiếp, bạn phụ thuộc vào bối cảnh ban đầu đôi khi có thể không tiện lợi.

IMHO tra cứu không hoạt động ở mọi nơi. Ví dụ trong Glassfish, một tra cứu trên một EJB cục bộ từ POJO sẽ chỉ hoạt động nếu đã được "nhập" trước đó với @EJBs(...) trên một trong các bean phiên sử dụng POJO. Xem this discussion. Bạn cần hiểu sự khác biệt giữa địa phươngtoàn cầu JNDI cho điều đó.

Lời khuyên của tôi sẽ là: sử dụng chú thích càng nhiều càng tốt. Nếu POJO cần tham chiếu đến EJB, hãy chuyển nó thành tham số (ví dụ: trong hàm tạo). Đó được gọi là đảo ngược phụ thuộc và dù sao cũng là một thực hành tốt.

0

Tôi nghĩ thật khó để giả lập các EJB được chú thích. Khi sử dụng tra cứu, bạn có thể xây dựng một số công tắc theo môi trường của bạn (test -> LoginMockBean, production -> LoginBean).

+2

Điều đó sai. Nếu nó được chứa bởi thùng chứa, điều đó có nghĩa là bạn có thể dễ dàng tiêm nó vào các thử nghiệm, ví dụ: 'MyBean bean = new MyBean(); bean.injectedBean = new Mock() '. Việc tìm kiếm trong tra cứu phức tạp hơn, đặc biệt nếu mã phụ thuộc vào 'InitialContext() mới'. Làm thế nào để bạn trả lại một phiên bản đặc biệt của bối cảnh cho các bài kiểm tra của bạn? – ewernli

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