Aspekt Orientiertes Programmieren (AOP)

Werbung
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
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: ein
benannter 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 Programmablauf 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

Herunterladen