I-ASOS Prednáška 8

XML a anotation based konfigurácia kontainera

Constructor a Setter based DI

  • odporucanie: povinne referencie pomocou constructor based DI problem: cyklické referencie

Autowiring

V xml nie je explicitne uvedená komponenta, ktorá má byť injektovaná ale vyhladanie vhodnej komonenty pre DI je prenechané na IoC kontainer. Atribút autowire udáva podľa čoho má vhodnú komponentu vyhľadať:

  • constructor (pre constructor based DI)
  • byName – podľa mena property (pre setter based DI)
  • byType – podľa typu property (pre setter based DI)

Autowiring pomocou anotácí

namiesto autowire atribútu v XML použijeme anotáciu @Autowired v kóde. Aby však kontainer vedel použiť anotácie treba do XML pridať element <context:annotation-config/>

Pozn. Pri vytváraní spring-config treba pridat knižnicu context

Anotáciu @Autowired môžeme použiť pre anotovanie construktora aj setter-metódy

Pre povinné referencie môžeme použiť aj anotáciu @Required Pre nepovinné referencie môžeme použiť @Autowired(required = false))

component-scan

V xml netreba uvádzať ani komponenty. Stačí tam dať element

ktorým kontaineru povieme v akom baliku má hladať komponenty. Komponenty musia byť anotované @Component prípadne. @Repository, @Service, @Controller

Java based container configuration

umožňuje konfiguráciu kontainera úplne bez XML. Namiesto XML je konfigurácia definovaná pomocou špeciálnej Factory triedy anotovanej @Configuration

Táto trieda implementuje factory metódy ktoré volá kontainer aby vytvoril komponenty. Faktory metódy sú anotované @Bean

Faktory trieda

Všimnite si, že myFactory volá konštruktor MessageProcessor s parametrom – teda využíva constructor-based DI. Pozn. (Rovnako je možné použiť aj setter-based DI – úloha na cvičenie) Samotná komponenta nemusí obsahovať žiadne anotácie (nemá ani žiadne iné závislosti na sprigu, spring anotácie sú odkomentované )

Komponenta

Aplikácia

Keďže je teraz konfigurácia kontainera definovaná Factory-triedou (namiesto xml dokumentu) musíme pre inicializáciu aplikácie použiť AnnotationConfigApplicationContext (namiesto ClassPathXmlApplicationContext).

AOP

http://www.tutorialspoint.com/spring/aop_with_spring.htm

The key unit of modularity in OOP is the class, whereas in AOP the unit of modularity is the aspect. Dependency Injection helps you decouple your application objects from each other and AOP helps you decouple cross-cutting concerns from the objects that they affect. AOP islike triggers.

  • OOP – odpovedá funkcionálnym požiadavkám
  • AOP – odpovedá nefunkcionálnym požiadavkám

Základné pojmy AOP

  • aspect
  • advice
    • before
    • after
    • after-returning
    • after-throwing
    • around
  • join point
  • pointcut
    • pointcut pattern je výraz, ktorý definuje pointcut. Najbežnejšie používaný je execution pointcut pattern, ktorého syntax je:

      execution ( modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(param-pattern) throws-pattern? )

      Pozn. Jazyk pre popis pointcut pattern je definovaný špecifikáciou AspectJ.

Dependences pre AOP

  • Do maven konfigurácie treba okrem spring doplniť aj dependency pre AOP

  • XML konfigurácia kontainera (beans.xml) musí importovať taglib http://www.springframework.org/schema/aop. Pri generovani konfigurácie pomocou netbeans wizardu to dosiahneme začeknutím aop-supportu.

Projekt

ilustruje použitie rôznych typov advice a pointcut výrazov. Jednoduchá aplikácia pozostáva z jednej komponenty s niekoľkými metódami, ktoré sú volané z hlavného programu.

Komponenta

implmentuje funkcionalitu aplikácie

Hlavný program

XML konfigurácia aplikácie

zatiaľ bez použitia AOP

Aspect

Funkcionalita aspektu je implementovaná v samostatnej komonente.

MyAspectBean implementuje ukážky rôznych typov advice metód:

  • myBeforeAdvice – vypíše informáciu o volaní metódy
  • myReturnAdvice – vypíše návratovu hodnotu volanej metódy
  • myAroundAdvice – zistí a vypíše dobu vykonavánia volanej metódy

XML konfigurácia s AOP

Modifikáciou konfigurácie môžeme teraz definovať v aplikácii rôzne pointcut-y a aktivovať pre ne jednotlivé advice

Before advice pre všetky metódy triedy MyOperationBean s menom začínajúcim na m

After returning advice pre všetky metódy MyOperationBean

Around advice pre metódu MyOperationBean.msg