Hiện tại nó thực sự là một chút khó hiểu vì hiện nay có nhiều mô hình thành phần trong Java EE. Đó là các loại Đậu được quản lý CDI , EJB3 và JSF .
CDI là đứa trẻ mới trong khối. Tính năng đậu CDI dependency injection
, scoping
và một event bus
. Đậu CDI là loại đậu linh hoạt nhất đối với việc tiêm và xác định phạm vi. Bus sự kiện rất nhẹ và rất phù hợp cho ngay cả những ứng dụng web đơn giản nhất. Ngoài ra, CDI cũng giới thiệu một tính năng rất nâng cao được gọi là portable extensions
, đây là một loại cơ chế trình cắm thêm cho các nhà cung cấp để cung cấp chức năng bổ sung cho Java EE có thể được cung cấp trên tất cả các triển khai (Glassfish, JBoss AS, Websphere, v.v.) .
Các bean EJB3 đã được trang bị thêm từ mô hình thành phần EJB2 cũ * và là các bean đầu tiên trong Java EE được quản lý các bean thông qua một chú thích. Đậu EJB3 tính năng dependency injection
, declarative transactions
, declarative security
, pooling
, concurrency control
, asynchronous execution
và remoting
.
Việc tiêm phụ thuộc vào đậu EJB3 không linh hoạt như trong đậu CDI và đậu EJB3 không có khái niệm xác định phạm vi. Tuy nhiên, các bean EJB3 được giao dịch và gộp theo mặc định ** , hai thứ rất hữu dụng mà CDI đã chọn để lại trong miền của EJB3. Các mục khác được đề cập cũng không có sẵn trong CDI. EJB3 không có bus sự kiện của riêng nó, nhưng nó có một loại bean đặc biệt để nghe thông báo; đậu điều khiển thông điệp. Điều này có thể được sử dụng để nhận tin nhắn từ Hệ thống nhắn tin Java hoặc từ bất kỳ hệ thống nào khác có bộ điều hợp tài nguyên JCA. Việc sử dụng thông báo đầy đủ cho các sự kiện đơn giản nặng hơn nhiều so với bus sự kiện CDI và EJB3 chỉ xác định trình nghe, không phải API của nhà sản xuất.
JSF Managed Beans đã tồn tại trong Java EE kể từ khi JSF được đưa vào. Họ cũng có tính năng dependency injection
và scoping
. JSF Managed Beans đã giới thiệu khái niệm về phạm vi khai báo. Ban đầu các phạm vi khá hạn chế và trong cùng một phiên bản Java EE, nơi các đậu EJB3 đã có thể được khai báo thông qua chú thích, các Đậu được quản lý JSF vẫn phải được khai báo bằng XML. Phiên bản hiện tại của JSF Managed Beans cuối cùng cũng được khai báo thông qua một chú thích và các phạm vi được mở rộng với một phạm vi xem và khả năng tạo phạm vi tùy chỉnh. Phạm vi chế độ xem, ghi nhớ dữ liệu giữa các yêu cầu đến cùng một trang là một tính năng độc đáo của JSF Managed Beans.
Ngoài phạm vi chế độ xem, vẫn còn rất ít thông tin về JSF Managed Beans trong Java EE 6. Thật không may, việc thiếu phạm vi xem trong CDI, vì nếu không CDI sẽ là một bộ siêu hoàn hảo của những gì JSF Managed Beans cung cấp. Cập nhật : Trong Java EE 7 / JSF 2.2, @ViewScoped tương thích với CDI đã được thêm vào, khiến CDI thực sự trở thành bộ siêu hoàn hảo. Cập nhật 2 : Trong JSF2.3, các bean được quản lý JSF đã không được dùng nữa để thay thế cho các bean được quản lý bằng CDI.
Với EJB3 và CDI, tình hình không rõ ràng như vậy. Mô hình thành phần EJB3 và API cung cấp rất nhiều dịch vụ mà CDI không cung cấp, do đó, thường không thể thay thế EJB3 bằng CDI. Mặt khác, CDI có thể được sử dụng kết hợp với EJB3 - ví dụ như thêm hỗ trợ phạm vi cho EJB.
Reza Rahman, thành viên nhóm chuyên gia và người triển khai triển khai CDI có tên là CanDI, đã thường xuyên gợi ý rằng các dịch vụ liên quan đến mô hình thành phần EJB3 có thể được trang bị thêm dưới dạng một tập hợp các chú thích CDI. Nếu điều đó xảy ra, tất cả các bean được quản lý trong Java EE đều có thể trở thành các bean CDI. Điều này không có nghĩa là EJB3 biến mất hoặc trở nên lỗi thời, mà chỉ là chức năng của nó sẽ được hiển thị thông qua CDI thay vì thông qua các chú thích riêng của EJB như @Stateless và @EJB.
Cập nhật
David Blevins của TomEE và OpenEJB nổi tiếng giải thích rất rõ về sự khác biệt và tương đồng giữa CDI và EJB trên blog của anh ấy: CDI, khi nào thì phá vỡ EJB
* Mặc dù nó chỉ là sự gia tăng về số phiên bản, nhưng đậu EJB3 phần lớn là một loại đậu hoàn toàn khác: một pojo đơn giản trở thành một "đậu được quản lý" bằng cách áp dụng một chú thích đơn giản, so với mô hình trong EJB2, nơi nặng và Bộ mô tả triển khai XML quá dài dòng được yêu cầu cho mỗi và mọi bean, ngoài ra bean còn được yêu cầu triển khai các giao diện thành phần cực kỳ nặng và đối với hầu hết các giao diện thành phần vô nghĩa.
** Các đậu phiên không trạng thái thường được gộp chung, các đậu phiên trạng thái thường không (nhưng có thể như vậy). Vì vậy, việc gộp chung cả hai loại là tùy chọn và thông số kỹ thuật EJB không bắt buộc theo cách nào đó.