Aspektorientierte Programmierung in Java OHNE AspectJ?

8

ok diese Frage wurde noch nie zuvor im Internet gestellt, also hier: Ich lerne Java (Anfänger-Mittelstufe) und entschloss mich, das Klassenprogramm zu absolvieren, indem ich die aspektorientierte Programmierung ausprobierte.

Jetzt soll das Ding einfach zu lernen sein (zumindest das ist der Webkonsens) so sehr, dass die "Aspekte" leicht modifizierte Versionen der Standardklassen sind, Also meine Frage ist: Wenn Aspekte im Grunde Klassen sind,

WARUM müssen wir AspectJ installieren, um AOP in Java auszuführen?

da dies nur eine zusätzliche Ebene der Komplexität hinzufügt, die das Konzept noch schwieriger zu begreifen macht.

Was ich will, ist in der Lage zu sein, einen Aspekt zu schreiben, ohne AspectJ (oder irgendein anderes Add-on) zu benutzen, mit anderen Worten, ich möchte AOP nur mit BASIC Java & amp; seine Standard-Java-Klassen. Ist es möglich und wenn ja, wie muss ich diese Klassen schreiben?

    
user3578836 27.04.2014, 18:14
quelle

2 Antworten

6

AspectJ ist ein, aus Mangel an einem besseren Wort, "reiner" Aspekt-Rahmen. Das Kriterium ist, dass es in allen möglichen Situationen eingesetzt werden kann. Jeder Aspekt in jeder Klasse zu jeder Zeit.

Das Aspect-Verfahren des Abfangens und Umbrechens von Methodenaufrufen hat jedoch seinen Weg in Java gefunden. Diese Tendenz hin zu einer Spezialisierung des generischen Aspektkonzepts für spezifische Zwecke.

Ein sehr früher "Aspekt" wurde mit den frühen EJB-Fähigkeiten gemacht. Dies erforderte die Verwendung von XML-Dateien, um Klassen und Schnittstellen zu erweitern, so dass der Container Proxy-Objekte erstellen konnte, die Methodenaufrufe in Transaktionskontexte umschlossen. Diese Umhüllung der Methoden ist ein Aspektkonzept, aber die frühe EJB-Spezifikation bot nur die Fähigkeit für den sehr spezifischen Anwendungsfall der Transaktionsverwaltung.

Das Eintreffen von Annotationen mit Java 1.5 eröffnete dieses Augmentationskonzept der aspektorientierten Programmierung. Es ist nicht so, dass Sie Annotationen benötigen, um dies zu ermöglichen, sondern es macht die Frameworks viel einfacher zu verwenden, da die Annotationen die externe Metadaten-Konfiguration eliminieren (unter Verwendung von XML-Dateien).

Nun verwenden viele Java-Systeme Konzepte der aspektorientierten Programmierung, typischerweise durch Reflektion und Anmerkungen, um bestimmte Fähigkeiten zu implementieren. Ob dies Instanzinjektion, Methoden, Validierung usw. ist.

Die Schlüsselkomponente für all das ist ein Mechanismus zum Abfangen des Methodenaufrufs. AspectJ arbeitete, indem er die Zielklasse spontan änderte, anstatt einen mittleren Mann zu intervenieren. EJB erstellt Proxys für Schnittstellen (etwas, was Sie in Java tun können), und wenn ein Programm den Container nach einer Instanz fragt, stellt es einen Proxy zur Verfügung, der von der tatsächlichen Instanz unterstützt wird.

Um "generisches" AOP überall und jederzeit zu aktivieren, brauchen Sie sicherlich etwas weit reichendes wie AspectJ. Aber um davon zu profitieren, müssen Sie nicht so weit gehen. Eine einfache Factory-Klasse und ein Interface können diese Aufgabe problemlos erledigen.

    
Will Hartung 27.04.2014 19:00
quelle
3

Java unterstützt AOP nicht standardmäßig und ich würde es nicht empfehlen, es selbst zu implementieren, da Sie die Klassendateien ändern müssen, während sie geladen werden. Alternativ könnten Sie auch die entsprechenden Klassendateien ändern, aber das wäre noch komplizierter.

AspectJ verwendet einen Java-Agenten, um den Web-Klassenlader einzurichten (der die Klassendateien beim Laden modifiziert), aber Sie können auch Ihren eigenen Klassenlader manuell verwenden. Wenn Ihre Klassen, die Sie ändern möchten, alle eine Schnittstelle implementieren, können Sie Java Proxies für AOP. Andernfalls müssen Sie eine externe Bibliothek wie CGLib, Javassist oder ASM verwenden (oder erfahren, wie Java Bytecode funktioniert).

Einige weitere Informationen:

Proxy-Beispiel:

%Vor%     
Joel Richard 27.04.2014 18:44
quelle

Tags und Links