AOP 개념 및 Spring 의 AOP 기능. Spring Framework – AOP 절차적 프로그래밍 OOP AOP.
W-JAX 07 - AOP im Einsatz mit OSGi und RCP
-
Upload
heiko-seeberger -
Category
Technology
-
view
1.980 -
download
0
description
Transcript of W-JAX 07 - AOP im Einsatz mit OSGi und RCP
AOP im Einsatz mit OSGi und RCP
Martin Lippert, Peter Friese und Heiko Seeberger
Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP2/?
Agenda
• Einführung
• Aspect-Weaving im Überblick
• Aspect-Weaving für OSGi:– Equinox Aspects
• Anwendungsfall: Security für Eclipse-RCP
• Abschluss
Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP3/?
Aspektorientierte Programmierung
• Modularisierung mit OO-Mitteln ist gut– Klassen, Interfaces, Vererbung, etc.
• AOP ergänzt die OO-Mittel– AOP modularisiert „Cross-Cutting Concerns“
ClassA ClassB ClassC AspectX
ConcernXConcernXConcernX
ConcernXConcernX
ConcernX
ConcernX
Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP4/?
AOP im Einsatz
• Mittlerweile etabliertes Werkzeug– AspectJ: Eine mächtige Spracherweiterung für Java
– Spring AOP: Einfache Handhabung für Enterprise-Anwendungen
– App-Server: Verwenden intern AOP-Mittel
Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP5/?
AspectJ = AOP für Java
• Mächtige AOP-Erweiterung für Java
• Eclipse-Projekt: www.eclipse.org/aspectj
• Gute Tool-Unterstützung:– AJDT für Eclipse
– Spring-IDE für Eclipse• Für die Verbindung von Spring-AOP und AJDT
Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP6/?
Wie funktioniert es?
• Der Standard-Fall:– AspectJ compiliert die Aspekte und verwebt diese
(Compile-Time Weaving)
– Sehr gute Unterstützung in der IDE• Inkrementelles Compilieren
• Marker und Crosscutting View
– Transparente Technologie für den Entwickler
Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP7/?
Der Standard-Fall
Java Virtual MachineJava Virtual Machine
App-Classloader
Projekt-Sourcen
ClassA ClassB ClassC AspectX
ConcernXConcernXConcernX
ConcernXConcernX
ConcernX
ConcernX
Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP8/?
Aspect-Libraries
• Aspekte werden mit AspectJ compiliert und in ein JAR-File verpackt– Z.B. auch abstrakte Aspekte
• Verweben mit anderen Klassen und Aspekten beim Build– In der IDE oder beim „Headless Build“
– Als ob die Aspekte direkt in der IDE vorhanden wären
Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP9/?
Java Virtual MachineJava Virtual Machine
Aspect-Libraries
App-Classloader
JARProjekt-Sourcen
ClassA ClassB ClassC AspectX
ConcernXConcernXConcernX
ConcernXConcernX
ConcernX
ConcernX
Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP10/?
„Projektfremde“ Targets
• Was passiert, wenn sich Aspekte auf vorcompilierte Klassen auswirken sollen?– Bibliotheken
– Frameworks
– andere Projekte
– etc.
Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP11/?
„Projektfremde“ Targets
Java Virtual MachineJava Virtual Machine
App-Classloader
Projekt-SourcenJARs
ClassA ClassB ClassC AspectX
ConcernXConcernXConcernX
ConcernXConcernX
ConcernX
ConcernX
Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP12/?
Variante 1: Compile-Time
• Der Compiler bekommt die JARs und webt die Aspekte direkt in die JARs ein
• Vor- und Nachteile:+ Direkt in der IDE
+ Zur Auslieferung ist alles fertig
- Alle Libs und Bibliotheken müssen bekannt und veränderbar sein
- Wenn sich etwas verändert, muss neu gebaut werden
Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP13/?
Variante 2: Load-Time
• Aspect-Weaving beim Laden der Klassen in die VM (Load-Time Weaving - LTW)
• Vor- und Nachteile:+ Kann sogar mit System-Libs umgehen
+ Funktioniert, auch wenn sich etwas verändert
+ Es müssen nicht alle Libs bekannt sein
- Kostet einmalig beim Laden der Klasse Performance
- Man sieht nicht alles in der IDE
Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP14/?
Load-Time Weaving
• Modularisierung kann lange aufrecht erhalten werden
• Aber nur, solange Aspekte und Klassen durch den gleichen Classloader geladen werden– Normalerweise der App-Classloader
Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP15/?
Aspekte und Bundles
• Im Kontext von OSGi werden Klassen innerhalb von Bundles gekapselt– Echte Modularisierung oberhalb von Packages
• Unser Ziel: Aspekte in Bundles modularisieren
• Aber: Jedes Bundle hat einen eigenen Classloader
Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP16/?
LTW und OSGi ?
• OSGi basiert auf einer ausgefeilten Class Loading Architecture.
• AspectJ Doc: „All load-time weaving is done in
the context of a class loader …“.
Herausforderung: Wie können die beiden Ansätze zusammengebracht werden?
Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP17/?
Java Virtual MachineJava Virtual Machine
Bundle-Classloader
Bundle A
Bundle-Classloader
Bundle B
LTW und OSGi ?
Bundle-Classloader
Bundle C
ClassA ClassB ClassC AspectX
ConcernXConcernXConcernX
ConcernXConcernX
ConcernX
ConcernX
????
Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP18/?
LTW in OSGi integrieren
• Aspekte werden in Bundles verpackt.
• OSGi-Runtime wird angepasst, sodass das Weaving beim Class Loading erfolgt.
Lösung: OSGi-Classloader erledigen das Aspect-Weaving beim Laden einer Klasse
Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP19/?
• Weaving erzeugt neue Abhängigkeiten, die nicht im Bundle-Manifest definiert sind.
Herausforderung: Wie können die Aspekte von der Klasse aufgelöst werden?
Abhängigkeiten
<<pointcut || advice>>
<<weaving>>
ClassA
BundleA
AspectX
BundleX
Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP20/?
Dynamische Abhängigkeiten
Lösung: Die Weaving-Runtime fügt die benötigten Abhängigkeiten dynamisch ein.
• Dazu muss die OSGi-Runtime entsprechend angepasst werden.
Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP21/?
Equinox Aspects
• Equinox-Incubator-Project– www.eclipse.org/equinox/incubator/aspects
• Framework Ext. org.aspectj.osgi.
• ClassLoadingHook bindet Weaving ein.
• BundleFileWrapperFactoryHook berücksichtigt die „neuen“ Abhängigkeiten.
• Weaving und Caching als OSGi-Services.
Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP22/?
Equinox Aspects verwenden 1
• aop.xml-Dateien:– Nur die aufgeführten Aspekte werden beim Weaving
berücksichtigt.
– Müssen in exportierten Packages liegen.
– Werden bekannt gegeben über: org.aspectj.weaver.loadtime.configuration, z.B. …configuration=org/aspectj/aop.xml.
Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP23/?
Equinox Aspects verwenden 2
• Spezielle Manifest-Header für Aspect-Bundles, z.B. Eclipse-SupplementBundle.
• Aufgeführte Bundles erhalten zur Laufzeit Abhängigkeit auf das Aspect-Bundle.
Eclipse-SupplementBundleClassA
BundleA
AspectX
BundleX
Require-Bundle
Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP24/?
Equinox Aspects verwenden 3
• Co-Location von org.eclipse.osgi und org.aspectj.osgi
• osgi.framework.extensions=org.aspectj.osgi
Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP25/?
Demo: Equinox Aspects
Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP26/?
AJEER
• „AspectJ-enabled Eclipse Runtime“:– Frühes Projekt zu AspectJ-Load-Time-Weaving für die
Eclipse-Runtime• Gab es schon für Eclipse 2.1, jetzt bis 3.3
– Aspekte werden per Extension-Point bekanntgemacht
• Mündet in Equinox Aspects
Anwendungsfall: Security
• Was soll erreicht werden?– Actions deaktivieren
– Ausführung von Actions verhindern
• Umsetzungsmöglichkeiten– Eigene Basisklasse für Actions einführen
– Capabilities
– Aspekte nutzen
Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP27/?
AJEER verwenden 1
• Security Aspekt in separatem Bundle
• Actions in anderen Bundles werden advised
Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP28/?
org.eclipse.ajeer.weavingruntime.aspectsAJEER
SecurityAspect
Security-Bundle
ActionA
BundleA
ActionB
BundleB
ActionC
BundleC
AJEER verwenden 2
Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP29/?
Aspekt definieren
AJEER verwenden 3
<extension
point="org.eclipse.ajeer.weavingruntime.aspects">
<aspect
class="jax.security.AuthorizationAspect"/>
</extension>
Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP30/?
Aspekt über Extension Point anmelden
Demo: AJEER Aspects
Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP31/?
Frontend
Security für Enterprise RCP
Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP32/?
org.eclipse.ajeer.weavingruntime.aspectsAJEER
SecurityAspect
Security-Bundle
Authenticator
Security-Connector
Backend
AccessControl
Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP33/?
Vielen Dank…
• … für die Aufmerksamkeit!!!
Martin Lippert ([email protected])
Peter Friese ([email protected])
Heiko Seeberger ([email protected])
Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP34/?
Zusatzmaterial
• Wie genau funktionieren die Adaptor-Hooks für Equinox?
Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP35/?
Equinox Hookable Adaptor
• Equinox ist sehr flexibel:– FrameworkAdaptor impl. oder erweitern.
– Hookable Adaptor (seit 3.2) bietet Hooks für „die wichtigsten“ Funktionalitäten.
• Hooks verwenden:– Framework Extension Bundle.
– HookConfigurator registriert Hooks.
Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP36/?
Demo: Equinox Hookable Adaptor