130 likes | 274 Views
AOP. Lösung für Querschnittsaufgaben. Was ist AOP ?. AOP ist kein Ersatz für OOP AOP ergänzt OOP AOP beinhaltet die Behandlung von Querschnittsaufgaben (crosscutting concerns) AOP = Aspekte + Aufrufregeln + Verbindungs-/Schnittpunkte. Hinweis.
E N D
AOP Lösung für Querschnittsaufgaben
Was ist AOP ? • AOP ist kein Ersatz für OOP • AOPergänzt OOP • AOP beinhaltet die Behandlung von Querschnittsaufgaben (crosscutting concerns) • AOP = Aspekte + Aufrufregeln + Verbindungs-/Schnittpunkte
Hinweis AOP „Aspekt-orientierte Programmierung“ ist kein systematisch gebildeter Begriff. Nichts ist da an Aspekten orientiert, es ist lediglich eine Alliteration auf OOP.
Inhalt • Grundlagen • AOP-Libraries, -Pakete, -Compiler • AOP in JSE, JEE • AOP als Klasse, als Annotation, per Deployment Deskriptor (in XML)
Gedankliches Modell • Aspekte sind Programmergänzungen • Die Schreibweise ist ähnlich der von Klassen • Verbindungspunkt / Joinpoint: einbenannter Punkt im Programmablauf, z. B. ein Funktionsaufruf
Gedankliches Modell • Pointcut / Schnittpunktmenge: definiert eine Menge gleich zu behandelnder Verbindungspunkte. • Empfehlung / Advice ist die Beschreibung, auf welche Art an einer Schnittpunktmenge der Programm-ablauf verändert werden soll.
MusterAspekt.aj (bisher im Client) package basisweb.muster.gui; import java.awt.event.ActionEvent; import basisweb.global.gui.AbstractMainPanel; public aspect MusterAspekt { pointcut neuPanel() : (call(public AbstractMainPanel+.new())); after() : neuPanel() { System.err.println("neues AbstractMainPanel: " + thisJoinPoint.getSourceLocation()); } pointcut actPerf() : (execution(public void AbstractMainPanel+.doActionPerformed(ActionEvent))) ; before() : actPerf() { System.err.println("ActionPerformed: " + thisJoinPoint.getSourceLocation()); } pointcut setPresentierer() : (execution(* basisweb.*.gui.*Panel.setPresenter(..))); before() : setPresentierer() { System.err.println("Hurra ich bekomm einen Presentierer!! " + thisJoinPoint.getSourceLocation()); } }
AufrufPruefer (Klasse) package basisweb.global.ejbs.eb.interceptors; import org.jboss.aop.joinpoint.MethodInvocation; import basisweb.recht.dto.LoginDTO; public class AufrufPruefer { public Object aufrufPruefAdvice (MethodInvocation mi) throws Throwable { Object [ ] args = mi.getArguments ( ) ; if ( args.length > 0 ) { Object a0 = args [ 0 ]; if ( a0 instanceof LoginDTO ) { String user = ( ( LoginDTO ) a0 ) .getName ( ) ; System.out.println ( "aufrufPruefAdvice: User " + ( user != null ? user : "(null)" ) + " calls "+ mi.getMethod().getName()); } } return ret; } }
AufrufPruefer (Deskriptor) jboss-aop.xml: <aop> <aspect name="basisWebAufrufPruefer" class="basisweb.global.ejbs.eb.interceptors.AufrufPruefer" scope="PER_VM" /> <pointcut name="SBAufruf" expr="execution(* basisweb.med.ejbs->*SBBean(basisweb.recht.dto.LoginDTO,..))" /> <bind pointcut="SBAufruf"> <advice name="aufrufPruefAdvice" aspect="basisWebAufrufPruefer" /> </bind> </aop>
AOP-Libraries • Zuerst gab es nur AspectJ • seit JBoss 4 gibt es JBoss-AOP als MBean-Interceptoren • seit JSE5 gibt es AspectJ5 Annotations • in JEE6 sind auch EJB Interceptoren (ähnlich JBoss) definiert. Werden auch in JBoss7 unterstützt. • für Servlets etc. gibt es Spring-AOP.
Varianten • Aspekte auf Klassen können den Programmablauf ändern, ohne den Text der Klasse zu ändern, aber Weaving ist nötig • Aspekte auf Annotations setzen voraus, daß diese schon im Text stehen, und Weaving ist auch nötig • Aspekte über XML können administrativ geändert werden auch ohne Weaving
Nutzbarkeit in Basis • Aspekte auf Klassen sind im Client leicht nutzbar. • im Server in EJBs sind Interceptoren der beste Weg.
Weitere Informationen • Bücher: • AspectJ: „Aspektorientierte Programmierung mit AspectJ5“, Böhm • EJB 2: „JBoss“, Rupp, Kapitel 8 • EJB 3: „EJB 3.1“, Eberling, Kap. 9.2 • Dokumentation im Netz: • zu JEE6 – Oracle • zu AspectJ – Eclipse • zu JBoss – JBoss-Community