AOP proxy

Chceme-li vytvořený aspekt použít v naší aplikaci, musíme nejdřív zajistit, aby se aspekt zařadil do řetězce zpracování metod našich tříd. Toho se v rámci Spring dosahuje tak, že pro cílový objekt (target object), tedy instanci naší třídy, je vytvořen tzv. AOP proxy objekt, jenž obaluje cílový objekt a „vydává“ se za objekt původní, při tom však už jde o kombinaci cílového objektu a aplikovaného pokynu. AOP proxy objekty lze vytvářet dvěma způsoby:

  1. použitím dynamických proxy, standardní to funkcionality JSE (Java Standard Edition),

  2. zapojením knihovny CGLIB, tedy knihovny pro běhovou úpravu Java kódu.

První řešení je upřednostňováno, neboť nevnáší do výsledné aplikace další závislost na externí knihovně. Lze tak ovšem pracovat pouze s cílovými objekty implementujícími nějaké rozhraní. Vytvořený AOP proxy objekt pak lze přetypovat pouze na toto rozhraní, nikoli na konkrétní třídu cílového objektu.

Použití CGLIB™ umožňuje aplikaci aspektů i na konkrétní třídy.

Tvorba AOP proxy objektů za použití standardních dynamických proxy je v rámci Spring™ realizována prostřednictvím třídy org.springframework.aop.framework.ProxyFactoryBean. Uveďme si příklad využívající výše definovaný aspekt a dříve uvedenou (oddíl „Odesílání e-mailů“) servisní třídu MailManagerImpl:

<bean id="mailManagerTarget" 
      class="cz.morosystems.sportportal.managers.MailManagerImpl">
  <property name="mailSender" ref="mailSender"/>
  <property name="commonFrom" value="info@seznam.cz" />
</bean>

<bean id="mailManager" 
      class="org.springframework.aop.framework.ProxyFactoryBean">
  <property name="proxyInterfaces" 
            value="cz.morosystems.sportportal.managers.MailManager" />
  <property name="target" ref="mailManagerTarget"/>
  <property name="interceptorNames">
    <list>
      <value>sampleAdvisor</value>
    </list>
  </property>
</bean>

<bean id="nejakyKontroler" class="....NejakyKontroler">
  <property name="mailManager" ref="mailManager" />
</bean>

Původní deklarace manažerského objektu třídy MailManagerImpl je zde zmiňovaným cílovým objektem. Třetí definicí v příkladu je kontroler, který má vlastnost (JavaBeans property) třídy MailManager. Dosud byl propojen přímo s cílovým objektem třídy MailManagerImpl, ovšem chceme-li aplikovat na toto rozhraní náš aspekt, musíme přinutit kontroler používat obalující AOP proxy objekt. A to je právě úkolem instance třídy ProxyFactoryBean, která představuje tovární objekt (factory object) aplikující seznam zadaných pokynů (v našem případě pouze jeden) v definovaném pořadí na specifikovaný cílový objekt. Tento tovární objekt vytvoří novou dynamickou proxy, která implementuje seznam rozhraní specifikovaných atributem proxyInterfaces. Výsledkem tedy je, že kontroler získá odkaz na nově vytvořený AOP proxy objekt a pracuje s ním prostřednictvím rozhraní MailManager.

Zavoláme-li v kontroleru metodu sendActivationEmail, tak bude nejdříve dotázána definice cílů, zda se má aplikovat specifikovaný pokyn. V případě kladné odpovědi bude vyvolána metoda invoke pokynu a skrze ni pak i cílová metoda sendActivationEmail cílového objektu třídy MailManagerImpl.

Komentáře

Téma neobsahuje žádné komentáře.

Vložit komentář

Můžete používat značkovací jazyk Texy!


Jméno:
E-mail:
Url:
Komentář:
1 + 2 =
 
MoroSystems, s.r.o.