Gunakan CDI.
Sesuai JSF 2.3, @ManagedBean
sudah tidak digunakan lagi . Lihat juga masalah spesifikasi 1417 . Ini berarti bahwa tidak ada lagi alasan untuk memilih @ManagedBean
lebih @Named
. Ini pertama kali diterapkan di Mojarra 2.3.0 versi beta m06.
Sejarah
Perbedaan utamanya adalah, @ManagedBean
dikelola oleh kerangka kerja JSF dan hanya @ManagedProperty
tersedia melalui biji yang dikelola JSF lainnya. @Named
dikelola oleh server aplikasi (wadah) melalui kerangka kerja CDI dan melalui @Inject
tersedia untuk setiap jenis wadah artefak dikelola seperti @WebListener
, @WebFilter
, @WebServlet
, @Path
, @Stateless
, dll dan bahkan JSF @ManagedBean
. Dari sisi lain, @ManagedProperty
tidak bukan bekerja di dalam @Named
atau wadah dikelola artefak lainnya. Ia bekerja hanya di dalam @ManagedBean
.
Perbedaan lainnya adalah CDI sebenarnya menyuntikkan proxy yang didelegasikan ke instance saat ini dalam cakupan target berdasarkan per-permintaan / utas (seperti bagaimana EJB diinjeksi). Mekanisme ini memungkinkan penyuntikan kacang dari lingkup yang lebih sempit ke dalam kacang dengan cakupan yang lebih luas, yang tidak mungkin dilakukan dengan JSF @ManagedProperty
. JSF "menyuntikkan" di sini contoh fisik secara langsung dengan memanggil penyetel (itu juga alasan mengapa penyetel diperlukan, sementara itu tidak diperlukan dengan @Inject
).
Meskipun tidak secara langsung merugikan - ada cara lain - cakupannya @ManagedBean
sangat terbatas. Dari perspektif lain, jika Anda tidak ingin mengekspos "terlalu banyak" @Inject
, Anda juga dapat menyimpan kacang yang Anda kelola @ManagedBean
. Ini seperti protected
versus public
. Tapi itu tidak dihitung.
Setidaknya, di JSF 2.0 / 2.1, kelemahan utama dari mengelola kacang pendukung JSF oleh CDI adalah tidak adanya CDI yang setara @ViewScoped
. The @ConversationScoped
datang dekat, tapi masih membutuhkan manual mulai dan berhenti dan menambahkan jelek cid
permintaan parameter untuk URL hasil. MyFaces CODI membuatnya lebih mudah dengan menjembatani JSF javax.faces.bean.ViewScoped
ke CDI secara transparan sehingga Anda dapat melakukannya @Named @ViewScoped
, namun itu menambahkan windowId
parameter permintaan yang jelek ke URL hasil, juga pada navigasi halaman-ke-halaman vanilla biasa. OmniFaces menyelesaikan ini semua dengan CDI sejati @ViewScoped
yang benar-benar mengikat ruang lingkup kacang ke status tampilan JSF alih-alih ke parameter permintaan arbitrer.
JSF 2.2 (yang dirilis 3 tahun setelah pertanyaan / jawaban ini) menawarkan @ViewScoped
anotasi baru yang kompatibel dengan CDI di luar kotak dalam bentuk javax.faces.view.ViewScoped
. JSF 2.2 bahkan hadir dengan CDI-only @FlowScoped
yang tidak memiliki @ManagedBean
padanan, dengan ini mendorong pengguna JSF ke CDI. Harapannya adalah bahwa @ManagedBean
dan teman-teman akan tidak digunakan lagi sesuai Java EE 8. Jika saat ini Anda masih menggunakan @ManagedBean
, oleh karena itu sangat disarankan untuk beralih ke CDI untuk bersiap untuk jalur peningkatan di masa mendatang. CDI sudah tersedia dalam wadah yang kompatibel dengan Profil Web Java EE, seperti WildFly, TomEE dan GlassFish. Untuk Tomcat, Anda harus menginstalnya secara terpisah, persis seperti yang Anda lakukan untuk JSF. Lihat juga Bagaimana cara menginstal CDI di Tomcat?