Kacang adalah kelas Java dengan nama metode yang mengikuti pedoman Java Bean (juga disebut pola desain) untuk properti , metode , dan acara. Dengan demikian, setiap metode publik dari kelas kacang yang bukan bagian dari definisi properti adalah metode kacang. Minimal, kelas Java bahkan dengan properti sebagai anggota tunggal (tentu saja, penyertaan publik dan pembuat set diperlukan), metode publik sebagai anggota tunggal atau hanya satu metode pendaftaran pendengar acara publik adalah kacang Jawa. Selanjutnya, properti dapat berupa properti hanya-baca (memiliki metode pengambil tetapi tidak ada setter) atau properti hanya-tulis (hanya memiliki metode setter). Kacang Jawa harus berupa kelas publik agar dapat dilihat oleh alat atau wadah beanbox apa pun. Wadah itu harus bisa instantiate; dengan demikian, ia harus memiliki konstruktor publik juga. The JavaBeans Spesifikasitidak memerlukan kacang untuk memiliki konstruktor zero-args publik, eksplisit atau default, untuk wadah untuk instantiate. Jika Anda bisa menyediakan file (dengan ekstensi .ser) yang berisi contoh serial, alat beanbox dapat menggunakan file itu untuk membuat contoh prototipe kacang. Kalau tidak, kacang harus memiliki konstruktor zero-args publik, baik eksplisit maupun default.
Setelah kacang dibuat, API Java Bean (java.beans. *) Dapat mengintrospeksi dan memanggil metode di dalamnya. Jika tidak ada kelas yang mengimplementasikan antarmuka BeanInfo atau memperluas implementasi BeanInfo, kelas SimpleBeanInfo, introspeksi melibatkan penggunaan refleksi (introspeksi implisit) untuk mempelajari metode yang didukung oleh kacang target dan kemudian menerapkan pola desain sederhana (pedoman) untuk menyimpulkan dari metode apa yang didukung properti, acara, dan metode publik. Jika kelas mengimplementasikan antarmuka BeanInfo (untuk bean Foo, harus bernama FooBeanInfo) tersedia, API memotong introspeksi implisit dan menggunakan metode publik (getPropertyDescriptor (), getMethodDescriptors (), getEventSetDescriptors (), getEventSetDescriptors ()) dari kelas ini untuk mendapatkan informasi. Jika kelas yang memperpanjang SimpleBeanInfo tersedia, tergantung pada mana dari metode publik SimpleBeanInfo (getPropertyDescriptor (), getMethodDescriptors (), getEventSetDescriptors ()) yang diganti, itu akan menggunakan metode yang ditimpa (s) untuk mendapatkan informasi; untuk metode yang tidak diganti, akan default ke introspeksi implisit yang sesuai. Kacang harus tetap dipakai meskipun tidak ada introspeksi implisit yang dilakukan. Dengan demikian, persyaratan konstruktor zeri-args publik. Tetapi, tentu saja, antarmuka Serializable atau Externalizable tidak diperlukan untuk dapat dikenali. Namun spesifikasi Java Bean mengatakan, 'Kami juga ingin itu menjadi "sepele" untuk kasus umum Bean kecil yang hanya ingin memiliki keadaan internal yang disimpan dan tidak ingin memikirkannya.' Jadi, semua kacang harus mengimplementasikan antarmuka Serializable atau Externalizable. Secara keseluruhan, Spesifikasi JavaBeans tidak sulit dan cepat tentang apa yang dimaksud dengan kacang. "Menulis komponen JavaBeans sangat mudah. Anda tidak memerlukan alat khusus dan Anda tidak perlu mengimplementasikan antarmuka apa pun. Menulis kacang hanyalah masalah mengikuti konvensi pengkodean tertentu. Yang harus Anda lakukan hanyalah membuat kelas Anda terlihat seperti kacang - alat yang menggunakan kacang akan dapat mengenali dan menggunakan kacang Anda. " Sepele, bahkan kelas berikut adalah Java Bean,
public class Trivial implements java.io.Serializable {}
Katakanlah, konstruktor kacang memiliki beberapa parameter. Misalkan beberapa tipe sederhana. Wadah tersebut mungkin tidak tahu nilai apa yang diberikan kepadanya; bahkan jika ya, instance yang dihasilkan mungkin tidak dapat digunakan kembali. Mungkin masuk akal hanya jika pengguna dapat mengkonfigurasi (menentukan nilai) dengan mengatakan anotasi atau file konfigurasi xml seperti pada Spring bean. Dan anggaplah beberapa parameter adalah tipe kelas atau antarmuka. Sekali lagi, wadah mungkin tidak tahu nilai apa yang diberikan padanya. Mungkin masuk akal hanya jika pengguna dapat mengkonfigurasi (menentukan objek tertentu) dengan mengatakan anotasi atau file konfigurasi xml. Namun, bahkan di Spring (melalui file konfigurasi xml), menugaskan objek tertentu (dengan nama string) ke argumen konstruktor (atribut atau elemen argumen konstruktor) bukan typesafe, pada dasarnya seperti injeksi sumber daya. Membuat referensi ke kacang Spring lainnya (disebut kolaborator; melalui elemen dalam elemen argumen konstruktor) pada dasarnya injeksi ketergantungan dan dengan demikian typesafe. Jelas, ketergantungan (kacang kolaborator) mungkin memiliki konstruktor dengan parameter yang disuntikkan; ketergantungan yang disuntikkan mungkin memiliki konstruktor dengan parameter dan sebagainya. Dalam skenario ini, pada akhirnya, Anda akan memerlukan beberapa kelas kacang (mis., MyBean.class) agar wadah dapat instantiate dengan hanya memanggil MyBean baru () sebelum dapat membangun kacang kolaborasi lainnya melalui injeksi ketergantungan pada konstruktor — dengan demikian, persyaratan untuk kacang untuk memiliki konstruktor zero-args publik. Misalkan, jika sebuah wadah tidak mendukung injeksi dependensi dan / atau tidak mengizinkan penetapan nilai tipe sederhana untuk konstruktor melalui beberapa anotasi atau file konfigurasi xml seperti di Spring, konstruktor kacang seharusnya tidak memiliki parameter. Bahkan aplikasi kacang Spring akan membutuhkan kacang untuk memiliki konstruktor zero-args publik (misalnya, dalam skenario di mana aplikasi Spring Anda tidak memiliki kacang dengan hanya tipe sederhana sebagai argumen konstruktor).
Kacang dikelola JSF dijalankan dalam wadah web. Mereka dapat dikonfigurasi baik dengan penjelasan @ManagedBean atau dengan file sumber daya konfigurasi aplikasi dikelola-bean.xml. Namun, ini mendukung injeksi melalui injeksi sumber daya (bukan typesafe) saja; tidak cocok untuk injeksi pada konstruktor. The JSF spesifikasimensyaratkan bahwa kacang yang dikelola harus memiliki konstruktor tanpa argumen publik. Lebih lanjut dikatakan, “Pada versi 2.3 spesifikasi ini, penggunaan fasilitas kacang yang dikelola sebagaimana ditentukan dalam bagian ini sangat tidak dianjurkan. Solusi terintegrasi yang lebih baik dan lebih kohesif untuk menyelesaikan masalah yang sama adalah dengan menggunakan Contexts and Dependency Injection (CDI), seperti yang ditentukan dalam JSR-365. untuk kacang Spring. Spesifikasi CDI mengadopsi spesifikasi Managed Beans, yang berlaku untuk semua wadah platform JEE, bukan hanya web tier. Jadi, wadah web perlu menerapkan spesifikasi CDI.
Berikut adalah kutipan dari spesifikasi Managed Bean
“Kacang yang Dikelola adalah objek yang dikelola dengan wadah dengan persyaratan minimal, atau dikenal dengan akronim“ POJO ”(Benda Jawa Tua Biasa)… mereka dapat dilihat sebagai versi JavaEE yang disempurnakan platform dari model komponen JavaBeans yang ditemukan pada platform Java SE … Tidak akan terlewatkan oleh pembaca bahwa Managed Beans memiliki pendahulu dalam fasilitas homonim yang ditemukan dalam teknologi JavaServer Faces (JSF)… Managed Beans sebagaimana didefinisikan dalam spesifikasi ini mewakili generalisasi dari yang terdapat di JSF; khususnya, Managed Beans dapat digunakan di mana saja dalam aplikasi Java EE, tidak hanya dalam modul web. Misalnya, dalam model komponen dasar, Kacang Terkelola harus menyediakan konstruktor tanpa argumen, tetapi spesifikasi yang dibangun di atas Kacang Terkelola, seperti CDI (JSR-299), dapat mengendurkan persyaratan itu dan memungkinkan Kacang Terkelola menyediakan tanda tangan yang lebih kompleks kepada konstruktor, selama mereka mengikuti beberapa aturan yang terdefinisi dengan baik ... Kacang Terkelola tidak boleh: kelas akhir, kelas abstrak, kelas dalam non-statis . A Managed Bean mungkin tidak dapat serial seperti komponen JavaBean biasa. " Dengan demikian, spesifikasi untuk Kacang Terkelola, atau dikenal sebagai POJO atau kacang POJO, memungkinkan ekstensi seperti dalam CDI.
Spesifikasi CDI mendefinisikan kembali kacang yang dikelola sebagai: Ketika berjalan di Java EE, kelas Java tingkat atas adalah kacang yang dikelola jika memenuhi persyaratan:
• Ini bukan kelas batin. • Ini adalah kelas non-abstrak, atau @Decorator beranotasi. • Ini tidak mengimplementasikan javax.enterprise.inject.spi.Extension. • Ini bukan @Vetoed beranotasi atau dalam paket @Vetoed beranotasi. • Ia memiliki konstruktor yang sesuai, baik: kelas memiliki konstruktor tanpa parameter, atau kelas menyatakan konstruktor beranotasi @Inject.
Semua kelas Java yang memenuhi persyaratan ini adalah kacang yang dikelola dan dengan demikian tidak diperlukan deklarasi khusus untuk mendefinisikan kacang yang dikelola. Atau
jika didefinisikan sebagai kacang yang dikelola oleh spesifikasi Java EE lainnya dan jika
• Ini tidak dijelaskan dengan anotasi pendefinisian komponen EJB atau dideklarasikan sebagai kelas kacang EJB di ejb-jar.xml.
Tidak seperti Spring Bean, itu tidak mendukung konstruktor dengan tipe sederhana, yang mungkin dimungkinkan jika mendukung konfigurasi dengan file konfigurasi xml seperti di Spring atau anotasi apa pun.
EJB dijalankan dalam wadah EJB. Its spesifikasimengatakan: "Komponen kacang sesi adalah Kacang Managed." "Kelas harus memiliki konstruktor publik yang tidak mengambil argumen," katanya untuk kacang sesi dan kacang yang digerakkan oleh pesan. Selanjutnya, dikatakan, "Kelas kacang sesi adalah tidak diperlukan untuk mengimplementasikan antarmuka SessionBean atau antarmuka Serializable. " Untuk alasan yang sama seperti kacang JSF, bahwa injeksi ketergantungan EJB3 pada dasarnya adalah injeksi sumber daya, kacang JSF tidak mendukung konstruktor dengan argumen, yaitu, melalui injeksi ketergantungan. Namun, jika wadah EJB mengimplementasikan CDI, "Opsional: Kelas mungkin memiliki konstruktor tambahan yang dijelaskan dengan anotasi Suntikan, “dikatakan untuk sesi kacang dan kacang yang digerakkan oleh pesan karena,“ Sebuah EJB yang dikemas dalam arsip kacang CDI dan tidak dijelaskan dengan javax.enterprise.inject. penjelasan Vote, dianggap sebagai CDI-enabled kacang."