Sử dụng CDI.
Theo JSF 2.3, @ManagedBean
được tán thành . Xem thêm thông số kỹ thuật số 1417 . Điều này có nghĩa rằng có không nữa một lý do để lựa chọn @ManagedBean
hơn @Named
. Điều này lần đầu tiên được triển khai trong phiên bản beta Mojarra 2.3.0 m06.
Lịch sử
Sự khác biệt cốt lõi là, @ManagedBean
được quản lý bởi khuôn khổ JSF và chỉ @ManagedProperty
có sẵn cho các bean được quản lý JSF khác. @Named
được quản lý bởi máy chủ ứng dụng (container) qua khuôn khổ CDI và là thông qua @Inject
cung cấp cho bất kỳ loại một tạo tác quản lý container như @WebListener
, @WebFilter
, @WebServlet
, @Path
, @Stateless
, vv và thậm chí là một JSF @ManagedBean
. Từ phía bên kia về, @ManagedProperty
không không làm việc bên trong một @Named
hoặc bất kỳ container quản lý vật khác. Nó chỉ hoạt động bên trong @ManagedBean
.
Một sự khác biệt khác là CDI thực sự đưa các proxy ủy quyền cho phiên bản hiện tại trong phạm vi đích trên cơ sở mỗi yêu cầu / luồng (giống như cách EJB được đưa vào). Cơ chế này cho phép đưa một bean có phạm vi hẹp hơn vào bean có phạm vi rộng hơn, điều này không thể thực hiện được với JSF @ManagedProperty
. JSF "đưa" vào đây trực tiếp cá thể vật lý bằng cách gọi một setter (đó cũng chính xác là lý do tại sao cần phải có setter, trong khi điều đó không bắt buộc với @Inject
).
Mặc dù không trực tiếp là một bất lợi - có những cách khác - phạm vi của @ManagedBean
nó chỉ đơn giản là hạn chế. Ở góc độ khác, nếu bạn không muốn phơi bày "quá nhiều" @Inject
, bạn cũng có thể giữ lại những hạt đậu đã quản lý của mình @ManagedBean
. Nó giống như protected
so với public
. Nhưng điều đó không thực sự được tính.
Ít nhất, trong JSF 2.0 / 2.1, nhược điểm lớn của việc quản lý các hạt sao lưu JSF bằng CDI là không có CDI tương đương @ViewScoped
. Quá trình @ConversationScoped
này đến gần, nhưng vẫn yêu cầu bắt đầu và dừng theo cách thủ công và nó thêm một cid
tham số yêu cầu xấu vào các URL kết quả. MyFaces CODI giúp việc này trở nên dễ dàng hơn bằng cách kết nối hoàn toàn minh bạch giữa JSF javax.faces.bean.ViewScoped
với CDI để bạn có thể thực hiện @Named @ViewScoped
, tuy nhiên, điều đó sẽ thêm một windowId
tham số yêu cầu xấu vào các URL kết quả, cũng trên điều hướng từ trang đến trang đơn giản. OmniFaces giải quyết tất cả điều này bằng một CDI @ViewScoped
thực sự liên kết phạm vi của bean với trạng thái xem JSF thay vì với một tham số yêu cầu tùy ý.
JSF 2.2 (được phát hành 3 năm sau câu hỏi / câu trả lời này) cung cấp một @ViewScoped
chú thích hoàn toàn mới tương thích với CDI javax.faces.view.ViewScoped
. JSF 2.2 thậm chí còn đi kèm với chỉ CDI @FlowScoped
mà không có @ManagedBean
tương đương, do đó thúc đẩy người dùng JSF hướng tới CDI. Kỳ vọng là như vậy @ManagedBean
và bạn bè sẽ không được chấp nhận theo Java EE 8. Nếu bạn hiện vẫn đang sử dụng @ManagedBean
, do đó, bạn nên chuyển sang CDI để chuẩn bị cho các lộ trình nâng cấp trong tương lai. CDI có sẵn trong các vùng chứa tương thích với Hồ sơ Web Java EE, chẳng hạn như WildFly, TomEE và GlassFish. Đối với Tomcat, bạn phải cài đặt nó một cách riêng biệt, chính xác như bạn đã làm cho JSF. Xem thêm Cách cài đặt CDI trong Tomcat?