ขณะนี้ค่อนข้างสับสนเนื่องจากขณะนี้มีโมเดลส่วนประกอบหลายตัวใน Java EE พวกเขาเป็นCDI , EJB3และJSF Managed ถั่ว
CDIเป็นเด็กใหม่ในบล็อก ถั่ว CDI มีdependency injection
, และscoping
event bus
ถั่ว CDI มีความยืดหยุ่นมากที่สุดเมื่อเทียบกับการฉีดและการกำหนดขอบเขต รถบัสเหตุการณ์มีน้ำหนักเบามากและเหมาะอย่างยิ่งสำหรับการใช้งานเว็บที่ง่ายที่สุด นอกจากนี้ CDI ยังมีคุณลักษณะขั้นสูงที่เรียกว่าportable extensions
ซึ่งเป็นกลไกปลั๊กอินสำหรับผู้ขายเพื่อให้ฟังก์ชันพิเศษแก่ Java EE ซึ่งสามารถใช้ได้กับการใช้งานทั้งหมด (Glassfish, JBoss AS, Websphere ฯลฯ ) .
ถั่วEJB3ได้รับการติดตั้งเพิ่มเติมจากโมเดลส่วนประกอบ EJB2 ดั้งเดิม*และเป็นถั่วแรกใน Java EE ที่ได้รับการจัดการถั่วผ่านคำอธิบายประกอบ ถั่ว EJB3 มีdependency injection
, declarative transactions
, declarative security
, pooling
, concurrency control
, และasynchronous execution
remoting
การฉีดแบบพึ่งพาในถั่ว EJB3 นั้นไม่ยืดหยุ่นเหมือนในถั่ว CDI และถั่ว EJB3 ไม่มีแนวคิดในการกำหนดขอบเขต อย่างไรก็ตามถั่ว EJB3 เป็นแบบธุรกรรมและรวมกันโดยค่าเริ่มต้น**สองสิ่งที่มีประโยชน์มากที่ CDI เลือกที่จะทิ้งไว้ในโดเมนของ EJB3 รายการอื่น ๆ ที่กล่าวถึงยังไม่มีใน CDI แม้ว่า EJB3 จะไม่มีบัสเหตุการณ์เป็นของตัวเอง แต่มันมีถั่วชนิดพิเศษสำหรับฟังข้อความ ถั่วที่ขับเคลื่อนด้วยข้อความ สามารถใช้เพื่อรับข้อความจาก Java Messaging System หรือจากระบบอื่น ๆ ที่มีอะแด็ปเตอร์รีซอร์ส JCA การใช้ข้อความเป่าเต็มรูปแบบสำหรับเหตุการณ์ง่ายๆนั้นมีน้ำหนักมากกว่าบัสเหตุการณ์ CDI และ EJB3 กำหนดเฉพาะผู้ฟังเท่านั้นไม่ใช่ API ผู้ผลิต
JSF Managed Beansมีอยู่ใน Java EE นับตั้งแต่มีการรวม JSF พวกเขามีมากเกินไปและdependency injection
scoping
JSF Managed Beans นำเสนอแนวคิดของการกำหนดขอบเขตแบบเปิดเผย เดิมขอบเขตค่อนข้าง จำกัด และใน Java EE เวอร์ชันเดียวกันที่สามารถประกาศถั่ว EJB3 ผ่านคำอธิบายประกอบได้แล้ว JSF Managed Beans ยังคงต้องประกาศใน XML ในที่สุด JSF Managed Beans เวอร์ชันปัจจุบันได้รับการประกาศผ่านคำอธิบายประกอบและขอบเขตจะขยายด้วยขอบเขตมุมมองและความสามารถในการสร้างขอบเขตที่กำหนดเอง ขอบเขตมุมมองซึ่งจดจำข้อมูลระหว่างการร้องขอไปยังเพจเดียวกันเป็นคุณลักษณะเฉพาะของ JSF Managed Beans
นอกเหนือจากขอบเขตมุมมองแล้วยังมี JSF Managed Beans ใน Java EE 6 น้อยมากขอบเขตมุมมองที่ขาดหายไปใน CDI นั้นโชคไม่ดีเนื่องจาก CDI จะเป็นชุดที่สมบูรณ์แบบของสิ่งที่ JSF Managed Beans นำเสนอ อัปเดต : ใน Java EE 7 / JSF 2.2 มีการเพิ่ม@ViewScoped ที่เข้ากันได้กับ CDI ทำให้ CDI เป็นชุดสุดยอดที่สมบูรณ์แบบ อัปเดต 2 : ใน JSF2.3 ถั่วที่มีการจัดการ JSF ได้เลิกใช้งานแล้วเพื่อสนับสนุนถั่วที่มีการจัดการ CDI
ด้วย EJB3 และ CDI สถานการณ์จะไม่ชัดเจนนัก โมเดลส่วนประกอบ EJB3 และ API มีบริการมากมายที่ CDI ไม่มีให้ดังนั้นโดยทั่วไปแล้ว EJB3 จึงไม่สามารถแทนที่ด้วย CDI ได้ ในทางกลับกัน CDI สามารถใช้ร่วมกับ EJB3 ได้เช่นเพิ่มการรองรับขอบเขตให้กับ EJB
Reza Rahman สมาชิกกลุ่มผู้เชี่ยวชาญและผู้ดำเนินการใช้งาน CDI ที่เรียกว่า CanDI ได้บอกใบ้บ่อยครั้งว่าบริการที่เกี่ยวข้องกับโมเดลส่วนประกอบ EJB3 สามารถติดตั้งเพิ่มเติมเป็นชุดคำอธิบายประกอบ CDI ได้ หากเป็นเช่นนั้นถั่วที่จัดการทั้งหมดใน Java EE อาจกลายเป็นถั่ว CDI นี่ไม่ได้หมายความว่า EJB3 หายไปหรือล้าสมัย แต่เพียงแค่นั้นฟังก์ชันการทำงานของมันจะถูกเปิดเผยผ่าน CDI แทนที่จะเป็นคำอธิบายประกอบของ EJB เช่น @Stateless และ @EJB
อัปเดต
David Blevins แห่ง TomEE และชื่อเสียงของ OpenEJB อธิบายความแตกต่างและความคล้ายคลึงกันระหว่าง CDI และ EJB ได้เป็นอย่างดีในบล็อกของเขา: CDI เมื่อใดที่จะแยก EJB
* แม้ว่าจะเป็นเพียงการเพิ่มขึ้นของหมายเลขเวอร์ชัน แต่ถั่ว EJB3 นั้นส่วนใหญ่เป็นชนิดของ bean ที่แตกต่างกันโดยสิ้นเชิง: pojo ธรรมดาที่กลายเป็น "ถั่วที่มีการจัดการ" โดยใช้คำอธิบายประกอบแบบง่าย ๆ เทียบกับแบบจำลองใน EJB2 ที่มีน้ำหนักมากและ ตัวบอกการปรับใช้ XML ที่ละเอียดเกินไปจำเป็นสำหรับแต่ละ bean นอกเหนือจาก bean ที่จำเป็นในการใช้งานที่มีน้ำหนักมากและสำหรับส่วนต่อประสานส่วนประกอบที่ไม่มีความหมายส่วนใหญ่
** โดยทั่วไปเซสชันถั่วที่ไม่มีสถานะจะถูกรวมเข้าด้วยกันโดยทั่วไปแล้วถั่วเซสชันที่มีสถานะจะไม่ได้ (แต่สามารถเป็นได้) สำหรับทั้งสองประเภทการรวมกลุ่มจึงเป็นทางเลือกและข้อมูลจำเพาะ EJB ไม่ได้กำหนดไว้ในทางใดทางหนึ่ง