ใช้ CDI
เป็นต่อ JSF 2.3 @ManagedBean
จะเลิก โปรดดูปัญหาข้อมูลจำเพาะ 1417ด้วย ซึ่งหมายความว่ามีไม่ได้อีกต่อเหตุผลที่จะเลือกมากกว่า@ManagedBean
@Named
สิ่งนี้ถูกนำมาใช้ครั้งแรกใน Mojarra 2.3.0 เบต้าเวอร์ชัน m06
ประวัติศาสตร์
ความแตกต่างที่สำคัญ@ManagedBean
คือได้รับการจัดการโดยเฟรมเวิร์ก JSF และ@ManagedProperty
สามารถใช้ได้กับถั่วที่มีการจัดการ JSF อื่นเท่านั้น @Named
มีการจัดการโดยแอพพลิเคชันเซิร์ฟเวอร์ (คอนเทนเนอร์) ผ่านกรอบ CDI และผ่านทาง@Inject
ที่มีอยู่กับชนิดของภาชนะสิ่งประดิษฐ์ที่มีการจัดการเช่นใด@WebListener
, @WebFilter
, @WebServlet
, @Path
, @Stateless
ฯลฯ และแม้กระทั่ง @ManagedBean
JSF จากด้านอื่น ๆ ที่@ManagedProperty
ไม่ได้ทำงานอยู่ภายใน@Named
หรืออื่น ๆ ใด ๆ สิ่งประดิษฐ์ภาชนะที่มีการจัดการ ใช้งานได้จริงเฉพาะภายใน@ManagedBean
จริงๆมันทำงานเฉพาะภายใน
ความแตกต่างอีกประการหนึ่งคือจริงๆแล้ว CDI จะฉีดพร็อกซีที่มอบหมายให้กับอินสแตนซ์ปัจจุบันในขอบเขตเป้าหมายตามคำขอ / เธรด (เช่นเดียวกับวิธีการฉีด EJB) กลไกนี้จะช่วยให้การฉีดถั่วขอบเขตแคบในถั่วของขอบเขตที่กว้างขึ้นซึ่งเป็นไปไม่ได้กับ @ManagedProperty
JSF JSF "ฉีด" อินสแตนซ์จริงที่นี่โดยตรงโดยเรียกใช้ตัวตั้งค่า (นั่นคือเหตุผลที่ต้องใช้ตัวตั้งค่าในขณะที่ไม่จำเป็นต้องใช้ด้วย@Inject
)
แม้ว่าจะไม่เสียเปรียบโดยตรง แต่ก็มีวิธีอื่น - ขอบเขตของ@ManagedBean
มันมี จำกัด จากมุมมองอื่น ๆ หากคุณไม่ต้องการเปิดเผย "มากเกินไป" @Inject
คุณสามารถเก็บถั่วที่มีการจัดการ@ManagedBean
ไว้ได้ มันเหมือนเมื่อเทียบกับprotected
public
แต่นั่นไม่นับจริงๆ
อย่างน้อยใน JSF 2.0 / 2.1 ข้อเสียที่สำคัญของการจัดการถั่วสำรอง JSF โดย CDI คือไม่มี CDI เทียบเท่ากับ@ViewScoped
ไฟล์. เข้า@ConversationScoped
มาใกล้ แต่ยังคงต้องเริ่มต้นและหยุดด้วยตนเองและต่อท้ายcid
พารามิเตอร์คำขอที่น่าเกลียดเพื่อผลลัพธ์ URL MyFaces CODI ช่วยให้ง่ายขึ้นโดยการเชื่อม JSF javax.faces.bean.ViewScoped
กับ CDI อย่างโปร่งใสเต็มที่เพื่อให้คุณสามารถทำได้@Named @ViewScoped
แต่จะต่อท้ายwindowId
พารามิเตอร์คำขอที่น่าเกลียดเพื่อผลลัพธ์ URL รวมทั้งในการนำทางแบบหน้าต่อหน้าของวานิลลาธรรมดา OmniFacesแก้ไขทั้งหมดนี้ด้วย CDI จริง@ViewScoped
ซึ่งเชื่อมโยงขอบเขตของ bean กับสถานะมุมมอง JSF แทนที่จะเป็นพารามิเตอร์การร้องขอโดยพลการ
JSF 2.2 (ซึ่งเผยแพร่ 3 ปีหลังจากคำถาม / คำตอบนี้) นำเสนอ@ViewScoped
คำอธิบายประกอบใหม่ที่เข้ากันได้กับ CDI ในรูปแบบjavax.faces.view.ViewScoped
. JSF 2.2 ยังมาพร้อมกับ CDI เท่านั้น@FlowScoped
ซึ่งไม่มี@ManagedBean
เทียบเท่าดังนั้นจึงผลักผู้ใช้ JSF ไปสู่ CDI ความคาดหวังคือ@ManagedBean
และเพื่อน ๆ จะเลิกใช้งานตาม Java EE 8 หากคุณยังคงใช้@ManagedBean
งานอยู่ขอแนะนำอย่างยิ่งให้เปลี่ยนไปใช้ CDI เพื่อเตรียมพร้อมสำหรับเส้นทางการอัปเกรดในอนาคต CDI พร้อมใช้งานในคอนเทนเนอร์ที่เข้ากันได้กับ Java EE Web Profile เช่น WildFly, TomEE และ GlassFish สำหรับ Tomcat คุณต้องติดตั้งแยกต่างหากเหมือนกับที่คุณทำกับ JSF ดูวิธีการติดตั้ง CDI ใน Tomcat