Fasola to klasa Java z nazwami metod zgodnymi z wytycznymi Java Bean (zwanymi również wzorami projektowymi) dla właściwości , metod i zdarzeń. Zatem każda publiczna metoda klasy fasoli, która nie jest częścią definicji właściwości, jest metodą fasoli. W minimalnym stopniu klasa Java, nawet z właściwością jako jedynym elementem (oczywiście, towarzyszącym publicznemu pobieraniu i ustawianiu), metoda publiczna jako jedyny element członkowski lub tylko jedna metoda rejestracji publicznego nasłuchiwania zdarzeń to komponent Java. Ponadto właściwość może być albo właściwością tylko do odczytu (ma metodę gettera, ale nie ma metody ustawiającej) lub właściwością tylko do zapisu (ma tylko metodę metody ustawiającej). Fasola Java musi być klasą publiczną, aby była widoczna dla dowolnego narzędzia lub kontenera beanbox. Kontener musi mieć możliwość jego utworzenia; dlatego też musi mieć też publicznego konstruktora. Specyfikacja JavaBeansnie wymaga, aby komponent bean miał publiczny konstruktor zero-args, jawny lub domyślny, aby kontener mógł go utworzyć. Jeśli możesz podać plik (z rozszerzeniem .ser) zawierający serializowane wystąpienie, narzędzie beanbox może użyć tego pliku do utworzenia instancji prototypowego komponentu bean. W przeciwnym razie komponent bean musi mieć publiczny konstruktor zero-args, jawny lub domyślny.
Po utworzeniu instancji komponentu bean API Java Bean (java.beans. *) Może go introspekować i wywoływać na nim metody. Jeśli nie jest dostępna żadna klasa implementująca interfejs BeanInfo lub rozszerzająca implementację BeanInfo, klasa SimpleBeanInfo, introspekcja polega na użyciu odbicia (niejawnej introspekcji) w celu zbadania metod obsługiwanych przez fasolę docelową, a następnie zastosowania prostych wzorców projektowych (wytycznych), aby wywnioskować z metody te, jakie właściwości, zdarzenia i metody publiczne są obsługiwane. Jeśli dostępna jest klasa implementująca interfejs BeanInfo (dla fasoli Foo, musi mieć nazwę FooBeanInfo), interfejs API omija niejawną introspekcję i korzysta z publicznych metod (getPropertyDescriptor (), getMethodDescriptors (), getEventSetDescriptors ()) tej klasy, aby uzyskać Informacja. Jeśli dostępna jest klasa rozszerzająca SimpleBeanInfo, w zależności od tego, które z publicznych metod SimpleBeanInfo (getPropertyDescriptor (), getMethodDescriptors (), getEventSetDescriptors ()) zostaną zastąpione, użyje tych przesłoniętych metod, aby uzyskać informacje; dla metody, która nie jest przesłonięta, domyślnie zostanie zastosowana odpowiednia ukryta introspekcja. I tak należy utworzyć instancję fasoli, nawet jeśli nie zostanie na niej przeprowadzona żadna domniemana introspekcja. Zatem wymóg publicznego konstruktora zer-args. Ale oczywiście interfejs Serializowalny lub Zewnętrzny nie jest konieczny do rozpoznania. Jednak specyfikacja Java Bean mówi: „Chcielibyśmy również, aby była„ trywialna ”w przypadku zwykłego przypadku małej fasoli, która po prostu chce zachować swój stan wewnętrzny i nie chce o tym myśleć”. Tak więc wszystkie komponenty bean muszą implementować interfejs Serializable lub Externalizable. Ogólnie, Specyfikacja JavaBeans nie jest trudna i szybka w kwestii tego, co stanowi fasolę. „Pisanie komponentów JavaBeans jest zaskakująco łatwe. Nie potrzebujesz specjalnego narzędzia i nie musisz implementować żadnych interfejsów. Pisanie ziaren to po prostu kwestia przestrzegania pewnych konwencji kodowania. Wszystko, co musisz zrobić, to sprawić, by klasa wyglądała jak fasola - narzędzia wykorzystujące fasolę będą w stanie rozpoznać i wykorzystać twoją fasolę. ” Trywialnie, nawet następująca klasa to Java Bean,
public class Trivial implements java.io.Serializable {}
Powiedzmy, konstruktor komponentu bean ma pewne parametry. Załóżmy, że niektóre są prostymi typami. Kontener może nie wiedzieć, jakie wartości mu przypisać; nawet jeśli tak się stanie, wynikowa instancja może nie nadawać się do ponownego użycia. Może to mieć sens tylko wtedy, gdy użytkownik może skonfigurować (określić wartości), powiedzmy adnotacje lub pliki konfiguracyjne xml, jak w przypadku Spring Bean. Załóżmy, że niektóre parametry są klasami lub typami interfejsów. Ponownie kontener może nie wiedzieć, jakie wartości mu przypisać. Może to mieć sens tylko wtedy, gdy użytkownik może skonfigurować (określić określone obiekty), powiedzmy adnotacje lub pliki konfiguracyjne xml. Jednak nawet w Springu (za pomocą plików konfiguracyjnych xml) przypisywanie określonych obiektów (z nazwami łańcuchów) do argumentów konstruktora (atrybut lub element argumentów konstruktora) nie jest bezpieczne dla typów; jest w zasadzie podobne do wstrzykiwania zasobów. Odwoływanie się do innych ziaren Springa (zwanych kolaborantami; przez element w elemencie argumentu konstruktora) jest w zasadzie wstrzykiwaniem zależności i dlatego jest bezpieczne. Oczywiście zależność (komponent bean współpracownika) może mieć konstruktor z wprowadzonymi parametrami; te wstrzykiwane zależności mogą mieć konstruktor z parametrami i tak dalej. W tym scenariuszu ostatecznie potrzebne byłyby niektóre klasy komponentów bean (np. MyBean.class), które kontener może utworzyć, po prostu wywołując new MyBean (), zanim będzie mógł zbudować inne współpracujące komponenty bean poprzez wstrzyknięcie zależności do konstruktorów - a zatem wymóg dotyczący fasola mieć publiczny konstruktor zero-args. Załóżmy, że jeśli kontener nie obsługuje wstrzykiwania zależności i / lub nie zezwala na przypisywanie konstruktorowi wartości prostych typów za pomocą adnotacji lub plików konfiguracyjnych XML jak w Springu, konstruktory komponentów bean nie powinny mieć parametrów. Nawet aplikacja Spring Bean potrzebuje pewnych ziaren, aby mieć publiczny konstruktor zero-args (np. W scenariuszu, w którym aplikacja Spring nie ma fasoli z prostymi typami jako argumentami konstruktora).
Fasole zarządzane JSF działają w kontenerze internetowym. Można je skonfigurować za pomocą adnotacji @ManagedBean lub pliku zasobów konfiguracyjnych aplikacji managed-bean.xml. Obsługuje jednak wstrzykiwanie tylko za pomocą wstrzykiwania zasobów (nie jest to typ bezpieczny); nie nadaje się do iniekcji na konstruktorach. Specyfikacja JSFwymaga, aby zarządzane komponenty bean musiały mieć publiczne konstruktory zero-argumentowe. Ponadto napisano: „Od wersji 2.3 niniejszej specyfikacji korzystanie z funkcji zarządzanego komponentu bean, jak określono w tej sekcji, jest zdecydowanie odradzane. Lepszym i bardziej spójnie zintegrowanym rozwiązaniem dla rozwiązania tego samego problemu jest użycie wstrzykiwania kontekstu i zależności (CDI), jak określono w JSR-365. ”Innymi słowy, należy użyć fasoli zarządzanej przez CDI, która oferuje wstrzyknięcie zależności od typu bezpiecznego dla konstruktorów podobnych do fasoli szparagowej. Specyfikacja CDI przyjmuje specyfikację Managed Beans, która ma zastosowanie do wszystkich kontenerów platformy JEE, a nie tylko warstwy WWW. W związku z tym kontener WWW musi implementować specyfikację CDI.
Oto wyciąg ze specyfikacji Managed Bean
„Fasola zarządzana to obiekty zarządzane przez kontener z minimalnymi wymaganiami, znane też pod akronimem„ POJO ”(Plain Old Java Objects)… można je postrzegać jako ulepszoną platformę Java EE model komponentu JavaBeans znaleziony na platformie Java SE … Czytelnik nie umknie uwadze, że Fasola Zarządzana ma prekursor w homonimicznym obiekcie znalezionym w technologii JavaServer Faces (JSF)… Fasola Zarządzana zdefiniowana w tej specyfikacji reprezentuje uogólnienie tych, które znaleziono w JSF; w szczególności Managed Beans może być używany w dowolnym miejscu aplikacji Java EE, nie tylko w modułach sieciowych. Na przykład w podstawowym modelu komponentu Managed Beans musi zapewniać konstruktor bez argumentów, ale specyfikację opartą na Managed Beans, taką jak CDI (JSR-299), może złagodzić ten wymóg i pozwolić Fasolom zarządzanym na dostarczenie konstruktorom bardziej złożonych podpisów, o ile będą przestrzegać ściśle określonych reguł ... Fasolka zarządzana nie może być: klasą ostateczną, klasą abstrakcyjną, niestatyczną klasą wewnętrzną . Managed Bean może nie być serializowany w przeciwieństwie do zwykłego komponentu JavaBean. ” Zatem specyfikacja dla zarządzanej fasoli, zwanej inaczej POJO lub fasolą POJO, pozwala na rozszerzenie jak w CDI.
Specyfikacja CDI ponownie definiuje zarządzane komponenty bean jako: Podczas działania w Javie EE klasa Java najwyższego poziomu jest zarządzaną fasolą, jeśli spełnia wymagania:
• To nie jest klasa wewnętrzna. • Jest to klasa nieabstrakcyjna lub jest opatrzona adnotacją @Decorator. • Nie implementuje javax.enterprise.inject.spi.Extension. • Nie ma adnotacji @Vetoed ani w paczce z adnotacją @Vetoed. • Ma odpowiedni konstruktor: albo klasa ma konstruktor bez parametrów, albo klasa deklaruje konstruktor z adnotacją @Inject.
Wszystkie klasy Java, które spełniają te warunki, są zarządzanymi komponentami bean, dlatego nie jest wymagana specjalna deklaracja w celu zdefiniowania fasoli zarządzanej. Lub
jeśli jest zdefiniowany jako fasola zarządzana według dowolnej innej specyfikacji Java EE i jeśli
• Nie jest opatrzony adnotacją adnotacją definiującą komponent EJB ani zadeklarowany jako klasa komponentu EJB w pliku ejb-jar.xml.
W przeciwieństwie do fasoli Spring nie obsługuje konstruktorów z typami prostymi, co może być możliwe, jeśli obsługuje konfigurację z plikami konfiguracyjnymi xml, takimi jak Spring lub adnotacjami.
EJB działają w kontenerze EJB. Jego specyfikacjamówi: „Komponent komponentu bean sesji jest komponentem Managed Bean”. „Klasa musi mieć konstruktora publicznego, który nie przyjmuje żadnych argumentów”, mówi zarówno dla komponentu bean sesji, jak i komponentu bean sterowanego komunikatami. Ponadto mówi: „Klasa bean sesji jest nie jest wymagane do wdrożenia interfejsu SessionBean ani interfejsu szeregowego. ” Z tego samego powodu, dla którego komponenty EJB3 są wstrzykiwane w zależności od EJB3, są w zasadzie wstrzykiwaniem zasobów, komponenty JSF nie obsługują konstruktorów z argumentami, to znaczy poprzez wstrzykiwanie zależności. Jednak jeśli kontener EJB implementuje CDI, „Opcjonalnie: klasa może mieć dodatkowy konstruktor opatrzony adnotacją Inject, „mówi zarówno dla komponentu bean sesyjnego, jak i komponentu opartego na komunikatach, ponieważ:„ EJB spakowany w archiwum komponentu bean CDI i nie opatrzony adnotacją javax.enterprise.inject.Vetoed, jest uważany za obsługujący CDI fasola."