ถั่วเป็นชั้น Java ที่มีชื่อวิธีการที่เป็นไปตามหลักเกณฑ์ Java Bean (ที่เรียกว่ารูปแบบการออกแบบ) สำหรับคุณสมบัติ , วิธีการและเหตุการณ์ที่เกิดขึ้น. ดังนั้นเมธอดสาธารณะใด ๆ ของคลาส bean ที่ไม่ได้เป็นส่วนหนึ่งของนิยามคุณสมบัติคือเมธอด bean ขั้นต่ำคลาส Java แม้จะมีคุณสมบัติเป็นสมาชิก แต่เพียงผู้เดียว (แน่นอนพร้อมกับประชาชนทะเยอทะยานและ setter ที่จำเป็น) วิธีสาธารณะในฐานะสมาชิกคนเดียวหรือเพียงหนึ่งวิธีการลงทะเบียนฟังเหตุการณ์สาธารณะเป็น Java bean นอกจากนี้คุณสมบัติสามารถเป็นคุณสมบัติแบบอ่านอย่างเดียว (มีเมธอด getter แต่ไม่มีเซ็ตเตอร์) หรือคุณสมบัติแบบเขียนอย่างเดียว (มีเมธอด setter เท่านั้น) Java bean ต้องเป็นคลาสพับลิกเพื่อให้สามารถเห็นได้โดยเครื่องมือ beanbox หรือคอนเทนเนอร์ใด ๆ ภาชนะจะต้องสามารถยกตัวอย่างได้ ดังนั้นจะต้องมีตัวสร้างสาธารณะด้วย ข้อกำหนด JavaBeansไม่ต้องการให้ bean มีตัวสร้างศูนย์ zero-args ที่ชัดเจนหรือเป็นค่าเริ่มต้นสำหรับคอนเทนเนอร์เพื่อสร้างอินสแตนซ์ หากคุณสามารถจัดเตรียมไฟล์ (พร้อมนามสกุล .ser) ที่มีอินสแตนซ์แบบอนุกรมเครื่องมือ beanbox สามารถใช้ไฟล์นั้นเพื่อสร้างอินสแตนซ์ของ bean ต้นแบบ มิฉะนั้น bean ต้องมีตัวสร้าง zero-args สาธารณะไม่ว่าจะชัดเจนหรือเป็นค่าเริ่มต้น
เมื่อ bean ถูกสร้างอินสแตนซ์ Java Bean API (java.beans. *) จะสามารถหยั่งรู้และเรียกวิธีการนั้น ๆ หากไม่มีคลาสที่ใช้อินเทอร์เฟซ BeanInfo หรือขยายการใช้งาน BeanInfo คลาส SimpleBeanInfo จะพร้อมใช้งานการวิปัสสนาเกี่ยวข้องกับการใช้การสะท้อน (การวิปัสสนาโดยปริยาย) เพื่อศึกษาวิธีการที่สนับสนุนโดยเป้าหมายถั่วแล้วใช้รูปแบบการออกแบบที่เรียบง่าย เมธอดเหล่านั้นที่สนับสนุนคุณสมบัติเหตุการณ์และเมธอดสาธารณะ หากคลาสที่ใช้อินเทอร์เฟซ BeanInfo (สำหรับ bean Foo นั้นจะต้องมีชื่อว่า FooBeanInfo) พร้อมใช้งาน API จะข้ามการวิปัสสนาแบบปริยายและใช้เมธอดสาธารณะ (getPropertyDescriptor (), getMethodDescriptors (), getEventSetDescriptors () ข้อมูล. หากคลาสที่ขยาย SimpleBeanInfo พร้อมใช้งาน ขึ้นอยู่กับวิธีการใดสาธารณะของ SimpleBeanInfo (getPropertyDescriptor (), getMethodDescriptors (), getEventSetDescriptors ()) จะถูกแทนที่มันจะใช้วิธีการแทนที่เหล่านั้นเพื่อรับข้อมูล สำหรับวิธีการที่ไม่ถูกแทนที่มันจะใช้ค่าปริยายที่สอดคล้องกันโดยปริยาย ถั่วจะต้องมีอินสแตนซ์ต่อไปแม้ว่าจะไม่มีการวิปัสสนาโดยปริยาย ดังนั้นความต้องการของผู้สร้าง zeri-args สาธารณะ แต่แน่นอนอินเตอร์เฟซแบบอนุกรมหรือภายนอกไม่จำเป็นต้องได้รับการยอมรับ อย่างไรก็ตามข้อมูลจำเพาะของ Java Bean กล่าวว่า 'เราต้องการให้มัน“ เล็กน้อย” สำหรับกรณีทั่วไปของ Bean Bean ตัวจิ๋วที่ต้องการรักษาสถานะภายในไว้และไม่ต้องการคิด' ดังนั้น beans ทั้งหมดต้องใช้อินเตอร์เฟสที่สามารถทำให้เป็นอนุกรมหรือ Externalizable ได้ โดยรวม, ข้อกำหนด JavaBeans ไม่ยากและรวดเร็วเกี่ยวกับสิ่งที่ถือถั่ว "การเขียนส่วนประกอบ JavaBeans นั้นง่ายมากคุณไม่จำเป็นต้องใช้เครื่องมือพิเศษและคุณไม่ต้องใช้ส่วนต่อประสานใด ๆ การเขียน beans เป็นเพียงเรื่องของการปฏิบัติตามข้อกำหนดในการเข้ารหัสบางอย่างที่คุณต้องทำคือทำให้คลาสของคุณดูเหมือน ถั่ว - เครื่องมือที่ใช้ถั่วจะสามารถจดจำและใช้ถั่วของคุณได้ " แม้แต่คลาสต่อไปนี้คือ Java Bean
public class Trivial implements java.io.Serializable {}
สมมติว่าคอนสตรัคถั่วมีพารามิเตอร์บางอย่าง สมมติว่าบางประเภทเป็นแบบง่าย คอนเทนเนอร์อาจไม่รู้ค่าที่จะกำหนดให้กับมัน แม้ว่าจะเป็นเช่นนั้นอินสแตนซ์ที่เกิดขึ้นอาจไม่สามารถใช้ซ้ำได้ อาจเหมาะสมถ้าผู้ใช้สามารถกำหนดค่า (ระบุค่า) โดยพูดคำอธิบายประกอบหรือไฟล์กำหนดค่า xml เช่นเดียวกับใน Spring beans และสมมติว่าพารามิเตอร์บางตัวเป็นคลาสหรือประเภทอินเตอร์เฟส อีกครั้งคอนเทนเนอร์อาจไม่รู้ค่าที่จะกำหนดให้กับมัน มันอาจสมเหตุสมผลถ้าผู้ใช้สามารถกำหนดค่า (ระบุวัตถุเฉพาะ) โดยพูดคำอธิบายประกอบหรือไฟล์การกำหนดค่า xml อย่างไรก็ตามแม้จะอยู่ใน Spring (ผ่านไฟล์การกำหนดค่า xml) การกำหนดวัตถุเฉพาะ (ด้วยชื่อสตริง) ให้กับตัวสร้างคอนสตรัคเตอร์ (แอตทริบิวต์หรือองค์ประกอบของข้อโต้แย้งคอนสตรัคเตอร์) ไม่ได้เป็นประเภทที่ปลอดภัย การอ้างอิงถึงฤดูใบไม้ผลิถั่วอื่น ๆ (เรียกว่าทำงานร่วมกัน; ผ่านองค์ประกอบในองค์ประกอบอาร์กิวเมนต์คอนสตรัค) เป็นพื้นฉีดพึ่งพาและ typesafe จึง เห็นได้ชัดว่าการพึ่งพา (collaborator bean) อาจมีคอนสตรัคเตอร์ที่มีพารามิเตอร์แบบฉีด การพึ่งพาการฉีดเหล่านั้น (IES) อาจมีคอนสตรัคเตอร์ที่มีพารามิเตอร์และอื่น ๆ ในสถานการณ์สมมตินี้ในที่สุดคุณจะต้องมีคลาสถั่ว (เช่น MyBean.class) ที่คอนเทนเนอร์สามารถสร้างอินสแตนซ์ได้โดยเพียงแค่เรียก MyBean ใหม่ () ก่อนที่มันจะสามารถสร้างถั่วที่ทำงานร่วมกันอื่น ๆ ผ่านการฉีดพึ่งพาผู้สร้าง bean ที่จะมีตัวสร้าง zero-args สาธารณะ สมมติว่าถ้าคอนเทนเนอร์ไม่สนับสนุนการขึ้นต่อกันของการพึ่งพาและ / หรือไม่อนุญาตให้กำหนดค่าแบบง่ายให้กับคอนสตรัคเตอร์ผ่านหมายเหตุประกอบหรือไฟล์ปรับแต่ง xml เช่นเดียวกับใน Spring ตัวสร้าง bean ไม่ควรมีพารามิเตอร์ แม้แต่แอปพลิเคชัน Spring beans อาจต้องการบาง bean เพื่อให้ตัวสร้าง zero-args คอนสตรัคต์ (เช่นในสถานการณ์ที่ Spring application ของคุณไม่มี bean ที่มีเพียงแค่ชนิดที่เรียบง่ายเป็นอาร์กิวเมนต์ตัวสร้าง)
ถั่วที่มีการจัดการ JSF ทำงานในเว็บคอนเทนเนอร์ สามารถกำหนดค่าได้ด้วยคำอธิบายประกอบ @ManagedBean หรือด้วยไฟล์ทรัพยากรการกำหนดค่าแอปพลิเคชัน managed-bean.xml อย่างไรก็ตามมันรองรับการฉีดผ่านการฉีดทรัพยากร (ไม่ใช่ประเภทที่ปลอดภัย) เท่านั้น ไม่เหมาะสำหรับการฉีดบนตัวสร้าง ข้อมูลจำเพาะ JSFต้องการให้ beans ที่ถูกจัดการต้องมีตัวสร้างอาร์กิวเมนต์ zero-อาร์กิวเมนต์ นอกจากนี้ยังกล่าวอีกว่า“ ในเวอร์ชั่น 2.3 ของข้อกำหนดนี้การใช้สิ่งอำนวยความสะดวกของถั่วที่มีการจัดการตามที่ระบุไว้ในส่วนนี้นั้นไม่ได้รับการสนับสนุนอย่างมาก วิธีการแก้ปัญหาแบบบูรณาการที่ดีขึ้นและร่วมกันมากขึ้นสำหรับการแก้ปัญหาเดียวกันคือการใช้ Contexts และ Dependency Injection (CDI) ตามที่ระบุใน JSR-365 "กล่าวอีกนัยหนึ่งคือการใช้ถั่วจัดการ CDI ซึ่งให้การพึ่งพา typeafe กับ Spring beans ข้อมูลจำเพาะ CDI ใช้ข้อมูลจำเพาะ Managed Beans ซึ่งใช้กับคอนเทนเนอร์ทั้งหมดของแพลตฟอร์ม JEE ไม่ใช่เฉพาะเว็บเทียร์ดังนั้นเว็บคอนเทนเนอร์ต้องใช้ข้อกำหนด CDI
นี่คือสารสกัดจากข้อมูลจำเพาะของถั่วที่จัดการ
“ Managed Beans เป็นวัตถุที่มีการจัดการตู้คอนเทนเนอร์โดยมีข้อกำหนดขั้นต่ำหรือที่รู้จักกันภายใต้ตัวย่อ“ POJOs” (วัตถุ Java เก่าธรรมดา) …พวกมันสามารถถูกมองว่าเป็นรุ่นที่ได้รับการพัฒนาแพลตฟอร์ม Java EE ของส่วนประกอบ JavaBeans รุ่นที่พบในแพลตฟอร์ม Java SE ... ผู้อ่านจะไม่พลาดว่า Managed Beans มีสิ่งอำนวยความสะดวกที่มีชื่อเหมือนกันที่พบในเทคโนโลยี JavaServer Faces (JSF) …ถั่วที่ได้รับการจัดการตามที่นิยามไว้ในข้อกำหนดนี้แสดงถึงลักษณะทั่วไปของ JSF; โดยเฉพาะ Managed Beans สามารถใช้ได้ทุกที่ในแอปพลิเคชัน Java EE ไม่ใช่เฉพาะในเว็บโมดูล ตัวอย่างเช่นในโมเดลคอมโพเนนต์พื้นฐาน Managed Beans ต้องระบุ constructor ที่ไม่มีอาร์กิวเมนต์ แต่เป็นข้อมูลจำเพาะที่สร้างบน Managed Beans เช่น CDI (JSR-299) สามารถผ่อนคลายความต้องการนั้นและอนุญาตให้ถั่วที่มีการจัดการเพื่อให้ตัวสร้างที่มีลายเซ็นที่ซับซ้อนมากขึ้นตราบใดที่พวกเขาปฏิบัติตามกฎบางอย่างที่กำหนดไว้ ... ถั่วที่ได้รับการจัดการจะต้องไม่: ชั้นสุดท้าย, นามธรรมระดับ . Managed Bean อาจไม่สามารถทำให้เป็นอนุกรมได้ซึ่งแตกต่างจากองค์ประกอบ JavaBean ทั่วไป” ดังนั้นข้อมูลจำเพาะสำหรับถั่วที่มีการจัดการหรือที่รู้จักกันในชื่อ POJOs หรือถั่ว POJO อนุญาตให้มีการขยายใน CDI
ข้อมูลจำเพาะ CDIกำหนดถั่วที่ถูกจัดการอีกครั้งเป็น: เมื่อรันใน Java EE คลาส Java ระดับบนสุดเป็นถั่วที่ถูกจัดการถ้าตรงตามข้อกำหนด:
•มันไม่ได้เป็นชั้นใน •เป็นคลาสที่ไม่เป็นนามธรรมหรือมีคำอธิบายประกอบ @Decorator •ไม่ใช้ javax.enterprise.inject.spi.Extension •ไม่ได้ใส่คำอธิบายประกอบ @Vetoed หรือในแพ็คเกจที่กำกับด้วย @Vetoed •มันมี Constructor ที่เหมาะสมเช่น: Class มี Constructor ที่ไม่มีพารามิเตอร์หรือคลาสประกาศ Constructor ที่ใส่คำอธิบายประกอบ @Inject
คลาส Java ทั้งหมดที่ตรงตามเงื่อนไขเหล่านี้คือ beans ที่ถูกจัดการดังนั้นจึงไม่จำเป็นต้องมีการประกาศพิเศษเพื่อกำหนด bean ที่ถูกจัดการ หรือ
หากถูกกำหนดให้เป็น bean ที่ถูกจัดการโดยข้อมูลจำเพาะ Java EE อื่นใดและหาก
•ไม่ได้ใส่คำอธิบายประกอบด้วยคำอธิบายประกอบที่กำหนดโดย EJB หรือประกาศเป็นคลาส EJB bean ใน ejb-jar.xml
ซึ่งแตกต่างจาก Spring beans ไม่สนับสนุนตัวสร้างที่มีประเภทง่าย ๆ ซึ่งอาจเป็นไปได้หากรองรับการกำหนดค่าด้วยไฟล์ xml config เช่นใน Spring หรือคำอธิบายประกอบใด ๆ
EJB รันในคอนเทนเนอร์ EJB ใช้สเปคพูดว่า:“ องค์ประกอบของเซสชั่นบีนคือ Managed Bean”“ คลาสจะต้องมีตัวสร้างสาธารณะที่ไม่มีอาร์กิวเมนต์” มันบอกว่าสำหรับทั้งเซสชั่นบีนและถั่วที่ขับเคลื่อนด้วยข้อความนอกจากนี้กล่าวว่า“ เซสชั่นบีนคลาสคือ ไม่จำเป็นต้องใช้อินเทอร์เฟซ SessionBean หรืออินเทอร์เฟซแบบอนุกรมได้” ด้วยเหตุผลเดียวกับถั่ว JSF การฉีดพึ่งพา EJB3 นั้นเป็นการฉีดทรัพยากรโดยทั่วไปถั่ว JSF ไม่สนับสนุนคอนสตรัคเตอร์ที่มีข้อโต้แย้งนั่นคือผ่านการฉีดพึ่งพาอย่างไรก็ตามถ้าคอนเทนเนอร์ EJB ใช้ CDI“ ทางเลือก: คลาสอาจมี คอนสตรัคเพิ่มเติมข้อเขียนที่มีคำอธิบายประกอบฉีด“ก็กล่าวว่าสำหรับทั้งถั่วครั้งและถั่วข้อความที่ขับเคลื่อนด้วยเพราะ“เป็น EJB บรรจุลงในที่เก็บ CDI ถั่วและไม่ได้มีคำอธิบายประกอบกับคำอธิบายประกอบ javax.enterprise.inject.Vetoed ถือเป็น CDI ที่เปิดใช้งาน ถั่ว."