Бін - клас Java з іменами методів, які відповідають правилам Java Bean (також називаються шаблонами дизайну) для властивостей , методів та подій. Таким чином, будь-який публічний метод класу bean, який не є частиною визначення властивості, є методом bean. Як мінімум, клас Java, навіть якщо власність є єдиним членом (звичайно, супроводжують публічний геттер і сетер), публічним методом як єдиним учасником або лише одним методом реєстрації слухачів публічних подій є Java-боб. Крім того, властивість може бути або властивістю лише для читання (має метод getter, але не setter), або властивість лише для запису (має лише метод setter). Яблуко Java має бути публічним класом, щоб його можна було побачити будь-якому інструменту чи контейнеру. Контейнер повинен мати можливість його екземпляру; таким чином, він також повинен мати публічний конструктор. Специфікація JavaBeansне вимагає, щоб bean мав публічний конструктор zero-args, явний або за замовчуванням, для контейнера для його ініціювання. Якщо ви могли б надати файл (з розширенням .ser), що містить серіалізований екземпляр, інструмент beanbox міг би використовувати цей файл для створення екземпляра прототипу. В іншому випадку bean повинен мати загальнодоступний конструктор нульових аргументів - явний або за замовчуванням.
Після того, як боб буде інстанційований, API Java Bean (java.beans. *) Може самоаналізувати його та викликати на ньому методи. Якщо немає класу, що реалізує інтерфейс BeanInfo або розширює реалізацію BeanInfo, клас SimpleBeanInfo, доступний, інтроспекція передбачає використання рефлексії (неявна інтроспекція) для вивчення методів, що підтримуються цільовим бобом, а потім застосування простих шаблонів проектування (інструкцій) для виведення ті методи, які підтримуються властивостями, подіями та загальнодоступними методами. Якщо клас, що реалізує інтерфейс BeanInfo (для біна Foo, він повинен бути названий FooBeanInfo) доступний, API обходить неявну самоаналіз і використовує публічні методи (getPropertyDescriptor (), getMethodDescriptors (), getEventSetDescriptors ()) цього класу, щоб отримати інформація. Якщо доступний клас, що розширює SimpleBeanInfo, залежно від того, який із загальнодоступних методів SimpleBeanInfo (getPropertyDescriptor (), getMethodDescriptors (), getEventSetDescriptors ()) буде перекрито, він буде використовувати ці перекричені методи (и) для отримання інформації; для методу, який не перекрито, він буде за замовчуванням відповідної неявної самоаналізу. Бобові потрібно все-таки придумувати, навіть якщо на ньому не проводиться неявна самоаналіз. Таким чином, вимога публічного конструктора zeri-args. Але, звичайно, інтерфейс Serializable або Externalizable не потрібен для його розпізнавання. Однак специфікація Java Bean говорить: "Ми також хотіли б, щоб вона була" тривіальною "для звичайного випадку крихітного Біна, який просто хоче зберегти свій внутрішній стан і не хоче думати про це". Отже, всі боби повинні реалізовувати інтерфейс Serializable або Externalizable. Загалом, Специфікація JavaBeans не є важкою і швидкою щодо того, що являє собою боб. "Написання компонентів JavaBeans напрочуд просто. Вам не потрібен спеціальний інструмент і вам не потрібно реалізовувати будь-які інтерфейси. Написання бобів - це лише питання дотримання певних умов кодування. Все, що вам потрібно зробити, - це зробити ваш клас схожим квасоля - інструменти, які використовують боби, зможуть розпізнати та використовувати вашу квасолю ». Тривіально, навіть наступний клас - це Java Bean,
public class Trivial implements java.io.Serializable {}
Скажімо, конструктор бобів має деякі параметри. Припустимо, деякі прості типи. Контейнер може не знати, які значення призначити їм; навіть якщо це так, то отриманий екземпляр може бути повторно використаний. Це може мати сенс лише в тому випадку, якщо користувач може налаштувати (вказати значення) за допомогою анотацій rec або файлів конфігурації xml, як у весняних бобах. І припустимо, деякі параметри - це клас або інтерфейс. Знову ж, контейнер може не знати, які значення йому призначити. Це може мати сенс лише в тому випадку, якщо користувач може налаштувати (вказати конкретні об'єкти) за допомогою анотацій скажіть або файлів конфігурації xml. Однак навіть навесні (за допомогою файлів конфігурації xml) присвоєння конкретних об'єктів (з іменами рядків) аргументам конструктора (атрибут або елемент аргументів конструктора) не є безпечним для введення тексту, це в основному як введення ресурсів. Посилання на інші весняні боби (звані колабораціоністами; через елемент в аргументі конструктора) в основному є введенням залежності і, таким чином, безпечно. Очевидно, що залежність (співпраця) може мати конструктор із введеними параметрами; ці введені залежності можуть мати конструктор з параметрами тощо. У цьому сценарії, в кінцевому підсумку, вам знадобляться деякі класи квасолі (наприклад, MyBean.class), які контейнер може створити, просто зателефонувавши до нового MyBean (), перш ніж він зможе сконструювати інші співпрацюючі боби за допомогою введення залежності від конструкторів - таким чином, вимога до боби матимуть загальнодоступний конструктор з нульовою стрілкою. Припустимо, якщо контейнер не підтримує введення залежності та / або не дозволяє призначити конструктору прості типи через деякі примітки або конфігураційні файли xml, як навесні, конструктори bean не повинні мати параметрів. Навіть у програмі Spring beans потрібні деякі боби, щоб мати загальнодоступний конструктор з нульовими args (наприклад, у сценарії, коли у вашому додатку Spring немає бобів із просто простими типами аргументів конструктора).
Квасоля, керована JSF, працює у веб-контейнері. Вони можуть бути налаштовані або з анотацією @ManagedBean, або з файлом ресурсу конфігурації програми керований-bean.xml. Однак він підтримує ін'єкцію лише за допомогою ін'єкції ресурсів (не типу); не підходить для ін'єкцій на конструкторах. Специфікація JSFвимагає, щоб керована квасоля повинна мати публічні конструктори з нульовими аргументами. Далі йдеться: “Згідно з версією 2.3 цієї специфікації використання керованого обладнання для бобів, як зазначено в цьому розділі, сильно не рекомендується. Кращим і більш згуртованим рішенням для вирішення тієї ж проблеми є використання контекстів та ін'єкцій залежностей (CDI), як зазначено в JSR-365. "Іншими словами, CDI, які керують CDI, повинні бути використані, що пропонує безпечну ін'єкційну залежність від подібних конструкторів. Спеціалізація CDI приймає специфікацію керованих бобів, яка застосовується до всіх контейнерів платформи JEE, а не лише до веб-ярусу. Таким чином, веб-контейнер повинен реалізувати специфікацію CDI.
Ось витяг із специфікації керованого квасолі
"Керовані боби - це об'єкти з керуванням контейнерами з мінімальними вимогами, інакше відомі під абревіатурою" POJOs "(Звичайні старі об'єкти Java) ... їх можна розглядати як розширену версію моделі компонентів JavaBeans на платформі Java SE, розширену платформою Java EE. …. Читач не пропустить, що керовані боби мають попередник у однойменному об'єкті, знайденому в технології JavaServer Faces (JSF)… Керовані боби, як визначено в цій специфікації, являють собою узагальнення тих, що знайдені в JSF; зокрема, керовані боби можна використовувати будь-де в додатку Java EE, а не лише у веб-модулях. Наприклад, у базовій компонентній моделі Managed Beans повинен забезпечувати конструктор без аргументів, а специфікацію, яка будується на керованих бобах, таких як CDI (JSR-299), може послабити цю вимогу і дозволити керованим Beans надавати конструкторам складніші підписи, якщо вони дотримуються деяких чітко визначених правил ... Керований Бін не повинен бути: кінцевий клас, абстрактний клас, нестатичний внутрішній клас . Керований бін може не бути серіалізаційним на відміну від звичайного компонента JavaBean. " Таким чином, специфікація керованих бобів, інакше відомих як POJO або POJO-боби, дозволяє розширити, як у CDI.
Специфікація CDI повторно визначає керовані боби як: Під час роботи в Java EE класом Java верхнього рівня є керований боб, якщо він відповідає вимогам:
• Це не внутрішній клас. • Це неабразований клас, або це анотація @Decorator. • Він не реалізує javax.enterprise.inject.spi.Extension. • Це не зазначається @Vetoed або в упаковці з анотацією @Vetoed. • У ній є відповідний конструктор: у класу є конструктор без параметрів, або клас оголошує конструктор в примітці @Inject.
Усі класи Java, які відповідають цим умовам, мають керовані боби, і тому для визначення керованої квасолі не потрібно особливої декларації. Або
якщо він визначений як керований боб будь-якою іншою специфікацією Java EE, і якщо
• Він не позначається анотацією, що визначає компонент EJB, або оголошується як клас EJB в ejb-jar.xml.
На відміну від весняних бобів, він не підтримує конструкторів з простими типами, що може бути можливим, якщо він підтримує конфігурацію з файлами конфігурації xml, як у Spring або будь-якими анотаціями.
EJB працюють у контейнері EJB. Його специфікаціякаже: "Компонент бін сеансу - керований бін". "Клас повинен мати публічний конструктор, який не бере ніяких аргументів", він говорить як для біна сеансу, так і для керованого повідомленнями. не потрібно для реалізації інтерфейсу SessionBean або інтерфейсу Serializable. " З тієї ж причини, що і для бобів JSF, що введення залежності EJB3 - це в основному введення ресурсів, боби JSF не підтримують конструкторів з аргументами, тобто через ін'єкцію залежностей. Однак, якщо контейнер EJB реалізує CDI, "необов'язково: клас може мати додатковий конструктор, позначений анотацією "Ін'єктувати", "говорить як про біл сеансу, так і для керованого повідомленнями, тому що:" EJB, упакований в архів CDA-бобів, а не зазначається javax.enterprise.inject.Ветанована анотація, вважається включеним в CDI квасоля ».