2012-06-10 10 views
6

Ich wollte es für mich klar machen.Was ist die große Idee hinter der AOP Implementierung

Ich las über AOP-Konzept und ich verstand, dass es eine gute Möglichkeit ist, Cross-Cut-Dienste zu teilen. (Logging, Sicherheit, Transaktion ...)

Aber ich möchte etwas über diese Idee und ihre Implementierung sagen/fragen.

Ich habe gelesen, es gibt einige Möglichkeiten wie AspectJ, JBOSS AOP, um AOP zu meiner Geschäftslogik Assimilation.

aber war es hier schon lange her?

lassen Sie uns zum Beispiel sagen, dass ich möchte, dass meine Komponenten eine Protokollierung oder Sicherheitsimplementierung amongs teilen (Java Beans, EJB, was auch immer ..)

Warum konnte ich nicht ein Singleton Bohne sicherstellen, dass es nur machen hat man Sobald eine Komponente ihren Protokollierungs-/Sicherheitsdienst benötigt, wird sie nachschlagen und ihren Dienst nutzen.

Warum sollte ich all diese "großen" Implementierungen wie aspectj oder jboss AOP verstehen müssen? Was vermisse ich hier?

Antwort

9

Die Idee von AOP ist es, allgemeine Logik an einem Ort zu halten (was auch Ihre Singleton Lösung löst) und ist "unsichtbar" (transparent). Mit AOP ist Ihr Logging-Code nicht einmal Teil der Geschäftslogik, er wird hinter die Kulissen "injiziert".

Außerdem ist es dynamischer - Sie müssen Ihren Singleton-Dienst nicht jedes Mal aufrufen, wenn Sie sich anmelden müssen. Konfigurieren Sie einfach einmal einen Pointcut (wie: "alle Setter in diesem Paket") und die Protokollierung wird für alle vorhandenen und neuen Code angewendet.

Darüber hinaus ist AOP viel, viel flexibler und leistungsfähiger. Sie können die AOP-Implementierung fragen: "Bitte starten Sie eine Transaktion jedes Mal, wenn ich eine Methode mit" save* "aufrufen und ein Argument nehme" oder "wenn die Methode Customer eine Exception-Unterklasse aus IllegalAgumentException auslöst, rufen Sie diese Methode erneut auf".

AOP ist viel mehr als nur gemeinsame Logik zu gruppieren.

+0

Was ist, wenn ich Elternklasse erstellen und erweitern habe meine Klassen daraus zu erweitern. Ich könnte all meine "perment" -Logik in diese Elternklasse einfügen. wenn eine Klasse es erweitern wird, wird es in der Lage sein, alle Loggig/secutiry ... Methoden zu genießen, die ich vorher erklärt hätte. Ich kann auch zusätzliche Methoden erstellen "create"/"destroy" für perment loggig und so .. – rayman

+0

@rayman: aber Sie müssen ** diese Methoden immer noch aufrufen ** (siehe großes Codebeispiel * JB Nizet *). AOP wird es für Sie tun, wenn Sie dazu aufgefordert werden, auch für den Code, den Sie noch nicht geschrieben haben! Dies bedeutet auch, dass neue Programmierer die Protokollierungs-/Sicherheitsfunktionen genießen werden, ohne sie zu kennen.Ganz zu schweigen davon, dass du deinen Code nicht mit Basisklassen/Hilfsmethoden überlagerst –

+0

Mybe könntest du meinen letzten Kommentar zu JB ansehen. – rayman

6

Sie haben nicht verstanden, worum es bei AOP geht. Die Idee von AOP ist in der Lage sein, alle zu schreiben

public void foo() { 
    // some business code 
} 

statt schreiben

public void foo() { 
    LogManager.getInstance().log("entering foo..."); 
    SecurityManager.getInstance().checkUserInRole("fooer"); 
    TransactionManager.getInstance().startTransaction(); 
    try { 
     // some business code 
     TransactionManager.getInstance().commit(); 
    } 
    catch(RuntimeException e) { 
     TransactionManager.getInstance().rollback(); 
     throw e; 
    } 
    LogManager.getInstance().log("leaving foo..."); 
} 

die Querschnittsthemen (Protokollierung, Sicherheit, Transaktionsmanagement) außerhalb des Unternehmens Code, statt gemischt mit dem Geschäftscode und wiederholt bis zum Überdruss wiederholt.

+0

Aber Sie müssen immer noch die AOP-Logik sagen, wann/wo Sie diese Dienste verwenden möchten .. Wie wird es wissen, dass ich Eingang/Ausgang einer Methode protokollieren möchte? oder wenn ich nur etwas in der mitte meiner methode loggen will ... irgendwas muss ich ihm sagen, es zu tun. es kann meine Gedanken nicht lesen .. – rayman

+0

Dies wird in der Regel deklarativ, in einer Konfigurationsdatei oder mit Java-Annotationen getan. Zum Beispiel erlaubt Spring das Markieren einer Methode mit '@ Transactional'. Es erlaubt auch, einen AOP-Interceptor so zu konfigurieren, dass alle Methoden aller Beans, deren Klassenname mit 'ServiceImpl'-Transaktional endet (dies ist nur ein Beispiel), ausgeführt werden. Wenn Sie etwas in der Mitte Ihrer Methode anmelden müssen, wird AOP Ihnen nicht helfen. –

+0

Also lasst es mich nur für die Protokollierung/Sicherheit verwenden ... ist das nicht ein bisschen übertrieben? Gibt es mehr Lösungen, für die ich AOP neben den 3, die du erwähnt hast, verwenden kannst? – rayman

Verwandte Themen