290 likes | 384 Views
VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA. Zbyněk Šlajchrt http://java.vse.cz/4it447/HomePage. Část 13. Další features WebBeans. Interceptory podobné interceptorům v EJB3 Dekorátory jako interceptory, ale obalují konkrétní třídu Události
E N D
VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA Zbyněk Šlajchrt http://java.vse.cz/4it447/HomePage Část 13.
Další features WebBeans • Interceptory • podobné interceptorům v EJB3 • Dekorátory • jako interceptory, ale obalují konkrétní třídu • Události • lze posílat notifikace o událostech posluchačům • Alternativy • konfigurace alternativních implementací beanů • Stereotypy • Svazková anotace kvalifikátorů a ostatních anotací
Interceptory • Blízcí příbuzní interceptorům z EJB3 • Umožňují programovat "cross-cutting concerns" • logování • profilování • transakce • bezpečnost • ... • WebBeans umožňuji asociovat typově bezpečně interceptory s beany • Prostřednictvím "custom" anotací (viz kvalifikátory)
Interceptor Binding Type (IBT) • Javovská anotace, pomocí které se asociuje interceptor a bean • IBT anotace je opatřena meta-anotacemi • @Inherited – anotace je děděna • @InterceptorBinding – identifikace IBT anotace
Třída interceptoru • Třída interceptoru se anotuje • @javax.interceptor.Interceptor • 'custom' IBT anotace - v našem případě @Log • Pro metody platí stejná pravidla, jako pro standardní EJB interceptory (viz 5. přednáška) • AroundInvoke inteceptory • Life-cycle interceptory
Asociování s beanem • Asociování interceptoru s beanem se provádí anotací metody nebo celého beanu příslušné IBT (custom) anotace
Aktivace interceptorů • Standardně jsou všechny interceptory neaktivní • Každý interceptor je třeba explicitně aktivovat v souboru beans.xml v sekci <interceptors>
Dekorátory • Dekorátory implementují jeden nebo více typů beanů (bean types) • Odchytávají volání business metod implementovaných dekorovanými typy beanů • Podobná koncepce jako interceptory • logika dekorátorů není cross-cutting • stává se součástí business logiky dekorovaných typů • Lze je nasadit na managed beany a EJB • nikoliv na jiné dekorátory či interceptory • Dekorátor je managed bean
Deklarace dekorátoru • Třída dekorátoru se anotuje • @javax.decorator.Decorator • Každá třída dekorátoru musí mít tzv. delegate injection point • Anotovaný @Delegate + kvalifikátory atp. • Lze nahlížet jako na standardní injektovaný atribut • Dekorátor dekoruje každý bean, který vyhovuje anotacím na atributu delegáta
Příklad třídy dekorátoru Dekorované jsou všechny beany, které implementuji ILogin (@Any)
Aktivace dekorátorů • Standardně jsou všechny interceptory neaktivní • Každý interceptor je třeba explicitně aktivovat v souboru beans.xml v sekci <decorators>
Události • Beany mohou vyrábět a konzumovat události • Snižuje se tak provázanost mezi beany (coupling) • Není nutná compile-time závislost mezi komunikujícími beany • Usnadňuje komunikaci mezi různými vrstvami aplikace • Stavový bean vysílá událost o změně stavu, která je přijata managed beanem ve webové vrstvě
Typ události • Objekt události je instancí bez-parametrové třídy - typu události
Generování událostí • Třída beanu deklaruje atribut typu javax.enterprise.event.Event • Parametrem tohoto generického rozhraní je typ události • Atribut se deklaruje pro injektáž • Událost se vyšle volání metody fire na atributu
Příjem události • Události se přijímají v tzv. observer metodách • Tyto metody mají právě jeden parametr, který odpovídá typu události • Tento parametr musí být anotován @javax.enterprise.event.Observes
Kvalifikátor události • Při deklaraci události lze uvádět kvalifikátor(y) události • "custom" anotace, která může obsahovat atributy • Deklarace události je doplněna o kvalifikátor
Příjem kvalifikované události • Parametr observer metody je dodatečně anotován kvalifikátorem
Dynamická volba kvalifikátoru • Kvalifikátor lze události přiřadit až za běhu • Vytvoří se třída, která implementuje rozhraní anotace kvalifikátoru • Při odesílání události se vytvoří instance této třídy a předá se metodě select v rozhraní Event • Metody select(...) slouží k dolaďování události // javax.enterprise.util.AnnotationLiteral
Transakční observer metody • Bean může být notifikován v různých fázích notifikační transakce, tj. rozesílání události příjemcům • Identifikátor fáze se zadá do atributu during anotace @Observes • javax.enterprise.event.TransactionPhase • BEFORE_COMPLETION • AFTER_COMPLETION • AFTER_FAILURE • AFTER_SUCCESS • IN_PROGRESS
Ukázka transakční observer metody Tato metoda se zavolá pouze v případě, že distribuce události proběhla bez chyby.
Alternativy • Alternativy jsou beany, kterými lze nahradit standardní beany během řešení závislostí. • Pokud vzniká nejednoznačnost v závislostech, řeší se tak, že se ze všech kandidátů vyloučí beany, které nejsou alternativy. • Pokud zbude jediný bean-alternativa, použije se pro uspokojení závislosti. Jinak chyba deploymentu. • Alternativy se musí aktivovat v beans.xml; podobně jako interceptory a dekorátory.
Příklad alternativy • Alternativní bean musí být anotován • @javax.enterprise.inject.Alternative
Stereotypy • Stereotyp zachycuje často se vyskytující svazek anotací • Tento svazek je deklarován jako další anotace • Anotace ve svazku jsou obvykle • Scope anotace (@SessionScoped atp.) • @Named • @Alternative • Interceptor binding anotace • Anotaci ve stereotypu lze překrýt explicitním uvedením příslušné anotace na třídě či jiném prvku
Vestavěné stereotypy • @javax.enterprise.inject.Model • Označuje bean z modelu v MVC frameworku, jako např. JSF. • Bean označený touto anotací • je pojmenovaný, tj. lze jej odkazovat z EL • je umístěn v Request scope
Poznámky • Aplikace musí vždy obsahovat beans.xml v adresáři WEB-INF • Pokud bean patří do pasivovatelného scope (např. @SessionScoped), interceptor i dekorátor musí být stejně jako bean pasivovatelný (stačí serializovatelný) • Chyby • Interceptory nefungují v EAR, pouze ve WAR • Dekorátory nefungují vůbec
Zdroje • http://java.sun.com/javaee/6/docs/tutorial • JSR-299: Contexts and Dependency Injection for the Java EE platform
Konec Děkuji za pozornost