2010-11-30 3 views
30

Lassen Sie mich zuerst bemerken, dass ich AspectJ benutze und ich mag es, aber was kann ich noch damit tun.Für was ist AspectJ gut?

Ich weiß AspectJ kann/wird für die Protokollierung verwendet. In einigen Fällen wird es für das Transaktionscontrolling verwendet - meist in Verbindung mit Annotationen. AspectJ kann auch verwendet werden, um Klassen mit (Code-generierten) Methoden zu verbessern, wie es Spring Roo tut.

Aber ich glaube AspectJ und AOP im Allgemeinen, kann für mehr als verwendet werden: Protokollierung, Transaktionssteuerung und Simulation Teilklassen.

Was sind andere nützliche Anwendungsfälle für AspectJ und AOP?

+2

Sie sollten AspectJ in Action von ramnivas laddad lesen http://www.manning.com/laddad2 Der TOC wird Ihnen ein Idee: http://www.manning.com/laddad2/excerpt_contents.html –

+2

@George Stocker: Die Frage hat 14 upvotes, 0 downvotes, 3 Antworten mit insgesamt 21 upvotes, und SIE setzen es nach 4 Jahren - wirklich ? Der Punkt ist, dass diese Frage gute Antworten hat, also hat sie dieses "zu breite" Problem nicht wirklich. – Ralph

+0

Wenn Sie über Schließung diskutieren möchten, zögern Sie nicht, es auf Meta zu bringen. Zu weit zu schließen ist unabhängig von Stimmen, Ansichten oder aktuellen Antworten. Es hat mit dem Umfang der Frage zu tun. –

Antwort

26
  • Berechtigungsprüfung
  • Interrupt-Aktion, die
  • Laufwirkung in separaten Thread oder auch in Zusammenhang mit anderen Prozess oder ein Ereignis an anderen Maschinen
  • Überwachung
  • Herstellung irgendeiner Daten/Umwelt zu lange dauert, bevor Aufruf und Verarbeitung Ergebnisse nach Anruf
  • Öffnen/Schließen Ressourcen

EDIT

Obwohl viele Jahre vergangen sind, seit ich diese Antwort gab, entschied ich mich, das Folgende hinzuzufügen, um die Antwort vollständiger zu machen.

  • Sicherheitsüberprüfung.
  • Fixes von inkorrektem oder Verhalten der API, die Sie nicht ändern können. Zum Beispiel eine boolesche Methode, die unter bestimmten Bedingungen false zurückgibt, aber true zurückgeben sollte. Sie können dies mit AspectJ beheben.
+1

Caching ist eine andere Verwendung – ex0b1t

+0

Danke, @ ex0b1t. Jede Liste wird niemals voll sein. – AlexR

16

Die Wikipedia entry gibt Ihnen ein paar weitere Beispiele (aber nicht so viele). In der Regel sollte aspektorientiertes Programmieren nur zum Implementieren einfacher Verhaltensweisen verwendet werden, die nicht zu den Kernproblemen einer Klasse gehören und verschiedenen Klassen gemeinsam sind. Sobald Sie anfangen, zu viel Logik in Ihren Aspekten zu setzen, wird der Code wirklich unlesbar.

Der von Ihnen vorgeschlagene Aspekt (Protokollierung, Transaktion, ...) wird am häufigsten verwendet. Ich würde auch Sicherheit hinzufügen.

2

Man kann AspectJ für die Durchsetzung einiger (Design-) Regeln verwenden.

  • wie jeder Controller-Methode müssen einige spezielle Anmerkungen
  • jeder Service/Frontend/dto Klasse muss in einem Service/fronten/dto thepacakge
  • reifere wie denkt befinden: checking that setters do not have any logic.

Inject Mocks in Klassen, die sonst neue Instanzen durch den Einsatz neuer schaffen würde. Angenommen, Sie haben diesen Code:

public void sendInvitationEmail(String address) { 
    InvitationEmail email = new InvitationEmail(); 
    email.sendTo(address).send(); 
} 

Und brauchen email durch ein Mock zu ersetzen. Dann könnten Sie einen Aspekt (@Pointcut("call(InvitationEmail.new(..))") ) verwenden, um einen Schein zu "injizieren". - @see Blog JMock and AspectJ von Daniel Roop, sowie Frühling Roo`s @MockStaticEntityMethods (Mock Static Methods using Spring Aspect)