Einführung
Die orientierte orientierte Programmierung (AOP) bietet eine weitere Perspektive, um über die Programmstruktur nachzudenken, die die Mängel der objektorientierten Programmierung (OOP) ausmacht. Zusätzlich zu Klassen bietet AOP Facetten. Modularisieren Sie den Fokus, wie z. B. das Übergangs-Transaktionsmanagement mehrerer Typen und Objekte. (Diese Bedenken werden häufig als Querversorgungsbedenken bezeichnet.)
Eine Schlüsselkomponente des Frühlings ist das AOP -Framework. Trotzdem verlassen sich Frühlings -IOC -Behälter nicht auf AOP, was bedeutet, dass Sie frei wählen können, ob Sie AOP verwenden möchten. AOP bietet eine leistungsstarke Middleware -Lösung, wodurch Frühlings -IOC -Container vollständiger werden.
Feder 2.0 AOP:
Spring 2.0 führt eine einfachere und leistungsstärkere Möglichkeit zum Anpassen des Abschnitts vor, und Benutzer können sich für die Verwendung von schema-basierten Methoden oder @aspectj-Anmerkungen verwenden. Bei neuen Anwendungen empfehlen wir, dass der Benutzer @aspespectj Style @aspespectj Style verwendet, andernfalls kann der Muster-basierte Stil verwendet werden. Beide Stile unterstützen den Beratungstyp und die Punkt-in-geschnittene Sprache von AspektJ, obwohl es mit Frühlings-AOP immer noch webt.
In diesem Kapitel wird hauptsächlich die Unterstützung von Spring 2.0 für musterbasierte und @Aspektj-basierte AOP erörtert. Feder 2.0 behält die Rückwärtskompatibilität von Feder 1,2 vollständig bei. Im nächsten Kapitel werden die zugrunde liegenden AOP -Unterstützung durch die Frühjahr 1.2 -API erörtert.
AOP im Frühjahr verwendet:
Deklarative Unternehmensdienste werden vor allem anstelle von EJB -deklarativen Diensten erbracht. Der wichtigste Service ist das deklarative Transaktionsmanagement, das auf der abstrakten Transaktionsabstraktion von Spring basiert.
Ermöglicht Benutzern, benutzerdefinierte Bereiche implementieren und AOP zur Verbesserung der Verwendung von OOP verwenden.
Beispiel
Wir verwenden oft die folgenden Typen
1. AOP basierend auf Agent
2. Reine und einfache Java -Objektfacetten
3.. @Aspespect Annotation Form
V.
Schreiben wir zuerst ein paar grundlegende Klassen.
Schnittstellenklasse:
/ *** eine Schnittstelle definieren*/ public interface sleepable {/ *** Schlafmethode*/ void sleep (); } Implementierungsklasse:
/ *** Ich implementiere die Schlafschnittstelle*/ Public Class Chenlina implementiert Sleepable {@Override public void sleep () {// Todo automatisch generierte Methode Stub System.out.println ("Sei gut, es ist Zeit, ins Bett zu gehen!"); }} Verbesserungsklasse:
/ *** Definieren Sie eine Schlafverbesserung, um sowohl vor als auch nach dem Einsatz zu erreichen. } @Override public void vor (Methodenmethode, Objekt [] args, Objektziel) löst Throwable {System.out.println ("Traum nach dem Schlafen") aus; }}1. Agentenbasierter AOP
<!-Erstellen Sie einen verbesserten Rat-> <bean id = "sleepHelper"/> <bean id = "lina"/> <!-Definieren Sie ein Punktschnitt überein alle Schlafmethoden-> <Bean ID = "SleePointCut"> <Eigenschaft name = "Muster" value = ". id = "sleepHelperAdvisor"> <Eigenschaft name = "rat" ref = "sleepHelper"/> <Eigenschaft name = "pointcut" ref = "SleePointCut"/> </bean> <!-Definieren Sie ein Proxy-Objekt-> <bean id = "linaproxy"> <Eigentumsname ". <!-<Eigenschaft name = "proxyinterfaces" value = "com.tgb.springaop.service.sleepable"/>-> </bean>
Wie in der Konfigurationsdatei:
Das Musterattribut gibt einen regulären Ausdruck an. Es entspricht allen Schlafmethoden. Verwenden Sie org.springframework.aop.support.DefaultPointCutAdvisor, um Tangentenpunkt und Verbesserung zu einer vollständigen Tangente zu kombinieren. Nach Abschluss der endgültigen Konfiguration wird ein endgültiges Proxy -Objekt über org.springframework.aop.framework.proxyfactoryBean generiert.
2. Reine und einfache Java -Objektfacetten
Wie sagt man diese rein einfachen Java -Objekt Facetten? Meiner Meinung nach ist es relativ zur ersten Konfiguration, die nicht die Verwendung eines Proxy erfordert, sondern automatisch den internen Federmechanismus durchsucht. Zu diesem Zeitpunkt sollte unsere Konfigurationsdatei wie folgt geändert werden:
<!-Erstellen Sie einen erweiterten Rat-> <bean id = "sleepHelper"/> <!-Zielklasse-> <bean id = "lina"/> <!-Konfigurieren Sie Punkte und Benachrichtigungen-> <bean id = "SleepAdvisor"> <Eigenschaft name = "Ratschläge" refithelpe ". -> <bean/>
Ist es viel einfacher als der erste? Sie müssen den Proxy nicht mehr konfigurieren?
3.. @Aspespect Annotation Form
Basierend auf unserer Erfahrung wissen wir auch, dass die Form der Anmerkungen einfacher ist als die Konfigurationsdatei. Zu diesem Zeitpunkt müssen Sie vorhandenen Methoden oder Klassen kommentieren:
/ ***Verbesserung durch Annotation addieren*/ @aspep @Component Class SleepHelper03 {/* @pointcut ("Ausführung (*com.tgb.springaop.Service.impl ..*(..)") ")*/ @pointcut (" Execution (*. public void Beforesleep () {System.out.println ("Gesichtsmaske vor dem Schlaf anwenden"); } @AfterReturning ("leePoint ()") public void Aftersleep () {System.out.println ("Traum nach dem Schlafen"); }
Schreiben Sie einfach in die Konfigurationsdatei:
<!-Scan-Paket-> <Context: component-scan base-package = "com.tgb" Annotation-config = "true"/> <!-Aspektj Annotation-> <AOP: Aspektj-Autoproxy Proxy-Target-Class = "True"/> <!-Zielklasse-> <bean id = "lina"/> "/>"/> "/>
4. ASPCET -Schnittflächen in Spritzformular
Ich persönlich bin der Meinung, dass dies der einfachste, am häufigsten verwendete und am flexibelste ist. Die Konfigurationsdatei lautet wie folgt:
<!-Zielklasse-> <bean id = "lina"/> <bean id = "sleepHelper"/> <AOP: config> <aop: Aspekt ref = "sleepHelper"> <aop: vor methode = "beforesep" pointcut = "Ausführung ( *. </AOP: Aspekt> </AOP: config>
Die in der Konfigurationsdatei erwähnte SleepHelper02 -Klasse lautet wie folgt:
/ *** Verbesserung durch Annotationen hinzufügen*/ öffentliche Klasse SleepHelper02 {public void Beforesleep () {System.out.println ("eine Gesichtsmaske vor dem Schlafengehen anwenden"); } public void AfterSeep () {System.out.println ("Traum nach dem Schlafen"); }}
Sieht es sehr einfach aus? Verwenden Sie alle Frühlings -AOP? !
In Bezug auf die Anforderung schrieb ich hier mehrere Testkurse. Sie können es sich ansehen. Sie sind im Grunde dasselbe:
/ *** Konfigurationsdatei spring_aop.xml über Proxy*/ @test public void test () {applicationContext ct = new classPhodexmlApplicationContext ("spring_aop.xml"); Sleepable sleeper = (sleepable) ct.getbean ("linaproxy"); schlafe.sleep (); } / *** Konfigurationsdatei Spring_aop_01.xml Kurzes Antwort Java -Objekt* / @Test public void test01 () {applicationContext ct = new classpathxmlApplicationContext ("Spring_aop_01.xml"); Sleepable sleeper = (sleepable) ct.getbean ("Lina"); schlafe.sleep (); } / *** Konfigurationsdatei Spring_aop_03.xml nach Aspekt annotiert* / @test public void test03 () {applicationContext ct = new classPathXmlApplicationContext ("Spring_aop_03.xml"); Sleepable sleeper = (sleepable) ct.getbean ("Lina"); schlafe.sleep (); } / *** Konfigurationsdatei Spring_aop_02.xml Konfigurationsdatei über apect* @author chen lina* @Version 31. Mai 2015 um 10:09:37 Uhr* / @Test public void test02 () {applicationContext ct = new classpathxmlapplicationContext ("spring_aop_02.xml"); Sleepable sleeper = (sleepable) ct.getbean ("Lina"); schlafe.sleep (); }
Aus der Testklasse können wir sehen, dass ihre Verwendung, egal wie wir AOP implementieren, nicht anders ist. Die Ergebnisse dieser Testklassen sind gleich: