ในระยะสั้น: คุณสามารถผสม ( @Singleton
และ@ApplicationScoped
) ได้และมันก็สมเหตุสมผลในบางสถานการณ์
(และทำงานได้ตามที่ฉันคาดไว้!)
นอกจากนี้สำหรับคำตอบอื่น ๆ จนถึงตอนนี้ฉันต้องการเพิ่มประเด็นอื่น ๆ เพื่อความกระจ่างในสถานการณ์จริง
สำหรับฉันคำถามนี้พัฒนามาจากฉันจะบังคับให้แอปพลิเคชันที่กำหนดขอบเขต bean อินสแตนซ์เมื่อเริ่มต้นแอปพลิเคชันได้อย่างไร
ในการสนทนาบางครั้งฉันได้กล่าวถึงสิ่งนี้และไม่สามารถหาข้อโต้แย้งที่ถูกต้องได้:
ในสถานการณ์ / การตั้งค่าในชีวิตจริงจำนวนมากฉันจะบอกว่ามันยากที่จะพูดอย่างแน่นอน - จากมุมมองที่เป็นนามธรรม / การสร้างแบบจำลอง - ไม่ว่าบางสิ่งจะเป็น (หรือจะกลายเป็น / ได้รับการปฏิบัติเช่นใด) EJB หรือถั่วที่มีการจัดการขอบเขตแอปพลิเคชัน
(เป็นที่ถกเถียงกัน แต่ไม่สามารถสรุปได้) ข้อโต้แย้ง (จากมุมมองของฉัน) กับมันจนถึงตอนนี้: (@BalusC และคนอื่น ๆ ทั้งหมด: ฉันอยากเห็นพวกเขาสรุปได้ แต่ถ้าไม่เป็นเช่นนั้นข้างต้นอาจเป็นจริงและอย่างไรก็ตามข้อโต้แย้งอาจ ยังคงช่วยให้ผู้อ่านได้รับความแตกต่าง / ข้อดี / ข้อเสีย / ไม่ดี / แนวทางปฏิบัติที่ดี)
EJB กับ Managed Bean
BalusC : นั่นคือ EJB ไม่ใช่ถั่วที่มีการจัดการซึ่งแตกต่างกันมาก EJB ทำงานในแบ็กเอนด์และถั่วที่มีการจัดการในส่วนหน้า EJB ทำงานในบริบทการทำธุรกรรมด้วย [... ] คุณเพิ่งสับสนถั่วขององค์กรกับถั่วที่มีการจัดการและฉันก็ชี้ให้เห็นว่า
แต่:
ฉัน : ฉันคิดว่าคุณไม่ค่อยถูกต้องนักและพูดเกินจริงในความหมาย / การใช้งานและมันก็ดูเป็นที่ถกเถียงกันสำหรับฉัน http://en.wikipedia.org/wiki/Enterprise_JavaBeans
Enterprise JavaBeans (EJB) เป็นซอฟต์แวร์เซิร์ฟเวอร์ที่มีการจัดการสำหรับการสร้างซอฟต์แวร์องค์กรแบบแยกส่วนและเป็นหนึ่งใน Java API หลายตัว EJB เป็นส่วนประกอบซอฟต์แวร์ฝั่งเซิร์ฟเวอร์ที่สรุปตรรกะทางธุรกิจของแอปพลิเคชัน
ประเภทของ Enterprise Beans
ถั่วเซสชัน [3] ที่สามารถเป็นได้ทั้งแบบ "Stateful", "Stateless" หรือ "Singleton" [... ]
ถั่วขับเคลื่อนข้อความ [... ]
... ซึ่งยังคงเป็นจริงในกรณีของฉัน
Singleton EJB เทียบกับ Application Scoped Bean
การล็อค
BalusC : Singleton EJB ไม่เหมือนกับแอปพลิเคชันที่กำหนดขอบเขตถั่ว Singleton EJB ถูกล็อคและอาจไม่มีประสิทธิภาพ / ซับซ้อนเกินไปสำหรับงานที่คุณคิดไว้ เรื่องสั้น: หยิบหนังสือ Java EE ดีๆสักเล่มและเรียนรู้การใช้เครื่องมือที่เหมาะสมกับงาน วิธีหนึ่งไม่ใช่วิธีอื่นแน่นอน มันได้ผลไม่ได้หมายความว่าเป็นเครื่องมือที่เหมาะสม ค้อนขนาดใหญ่สามารถขันสกรูได้ แต่ก็ไม่จำเป็นต้องเป็นเครื่องมือที่เหมาะสม :)
แต่:
(ฉันไม่เห็นค้อนขนาดใหญ่ที่นี่ - ขออภัย ... ) เป็นเรื่องดีที่ทราบค่าเริ่มต้นการล็อก (ฉันไม่รู้) แต่ดูเหมือนว่าจะไม่ถูกต้องอีกครั้ง: บทช่วยสอน Oracle Java EE 6เกี่ยวกับการจัดการการเข้าถึงพร้อมกันใน a Singleton Session Bean
เมื่อสร้างเซสชัน bean แบบซิงเกิลตันการเข้าถึงวิธีการทางธุรกิจของ singleton พร้อมกันสามารถควบคุมได้สองวิธี: การจัดการพร้อมกันด้วยคอนเทนเนอร์และการจัดการพร้อมกันของ bean [... ]
แม้ว่าโดยค่าเริ่มต้น singletons จะใช้ container-management concurrency แต่คำอธิบายประกอบ @ConcurrencyManagement (CONTAINER) อาจถูกเพิ่มที่ระดับคลาสของซิงเกิลตันเพื่อตั้งค่าประเภทการจัดการพร้อมกันอย่างชัดเจน
@ApplicationScoped
และ@Singleton
ในมาตรา 5.4 (น. 36)