Spring AOP Beispiel - Pointcut, Advisor
In den letztenSpring AOP advice examples werden die gesamten Methoden einer Klasse automatisch abgefangen. In den meisten Fällen benötigen Sie jedoch nur eine Möglichkeit, nur eine oder zwei Methoden abzufangen. Dies ist der Zweck von "Pointcut". Sie können eine Methode anhand des Methodennamens abfangen. Außerdem muss ein „Pointcut“ mit einem „Advisor“ verknüpft sein.
Im Frühjahr kommt AOP mit drei sehr technischen Begriffen -Advices, Pointcut , Advisor, inoffiziell ausgedrückt ...
-
Hinweis - Geben Sie die Aktion an, die vor oder nach der Ausführung der Methode ausgeführt werden soll.
-
Pointcut - Geben Sie anhand des Methodennamens oder des Musters für reguläre Ausdrücke an, welche Methode abgefangen werden soll.
-
Advisor - Gruppieren Sie "Advice" und "Pointcut" zu einer Einheit und übergeben Sie sie an ein Proxy-Factory-Objekt.
Überprüfen Sie die letztenSpring AOP advice examples erneut.
Datei: CustomerService.java
package com.example.customer.services; public class CustomerService { private String name; private String url; public void setName(String name) { this.name = name; } public void setUrl(String url) { this.url = url; } public void printName(){ System.out.println("Customer name : " + this.name); } public void printURL(){ System.out.println("Customer website : " + this.url); } public void printThrowException(){ throw new IllegalArgumentException(); } }
Datei: Spring-Customer.xml
hijackAroundMethodBeanAdvice
Datei: HijackAroundMethod.java
package com.example.aop; import java.util.Arrays; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; public class HijackAroundMethod implements MethodInterceptor { @Override public Object invoke(MethodInvocation methodInvocation) throws Throwable { System.out.println("Method name : " + methodInvocation.getMethod().getName()); System.out.println("Method arguments : " + Arrays.toString(methodInvocation.getArguments())); System.out.println("HijackAroundMethod : Before method hijacked!"); try { Object result = methodInvocation.proceed(); System.out.println("HijackAroundMethod : Before after hijacked!"); return result; } catch (IllegalArgumentException e) { System.out.println("HijackAroundMethod : Throw exception hijacked!"); throw e; } } }
Starte es
package com.example.common; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.example.customer.services.CustomerService; public class App { public static void main(String[] args) { ApplicationContext appContext = new ClassPathXmlApplicationContext( new String[] { "Spring-Customer.xml" }); CustomerService cust = (CustomerService) appContext .getBean("customerServiceProxy"); System.out.println("*************************"); cust.printName(); System.out.println("*************************"); cust.printURL(); System.out.println("*************************"); try { cust.printThrowException(); } catch (Exception e) { } } }
Ausgabe
************************* Method name : printName Method arguments : [] HijackAroundMethod : Before method hijacked! Customer name : Yong Mook Kim HijackAroundMethod : Before after hijacked! ************************* Method name : printURL Method arguments : [] HijackAroundMethod : Before method hijacked! Customer website : http://www.example.com HijackAroundMethod : Before after hijacked! ************************* Method name : printThrowException Method arguments : [] HijackAroundMethod : Before method hijacked! HijackAroundMethod : Throw exception hijacked!
Die gesamten Methoden der Kundendienstklasse werden abgefangen. Später zeigen wir Ihnen, wie Sie mit „pointcuts“ nur die MethodeprintName()
abfangen können.
Pointcuts Beispiel
Sie können die Methode auf zwei Arten abgleichen:
-
Name stimmt überein
-
Regelmäßiges Verdrängungsspiel
1. Pointcuts - Beispiel für Namensübereinstimmung
Fangen Sie eine printName () -Methode über "pointcut" und "advisor" ab. Erstellen Sie eine Pointcut-Bean fürNameMatchMethodPointcutund geben Sie den Methodennamen, den Sie abfangen möchten, in den Eigenschaftswert vonmappedNameein.
Erstellen Sie eineDefaultPointcutAdvisor-Ratgeber-Bean und ordnen Sie sowohl Ratschläge als auch Pointcut zu.
Ersetzen Sie die "interceptorNames" des Proxys durch "customerAdvisor" (es war "hijackAroundMethodBeanAdvice").
customerAdvisor
Vollständige Bean-Konfigurationsdatei
customerAdvisor
Führen Sie es erneut aus
************************* Method name : printName Method arguments : [] HijackAroundMethod : Before method hijacked! Customer name : Yong Mook Kim HijackAroundMethod : Before after hijacked! ************************* Customer website : http://www.example.com *************************
Jetzt fangen Sie nur die printName () -Methode ab.
PointcutAdvisor
Spring wird mit der KlassePointcutAdvisorgeliefert, um Ihre Arbeit zu speichern und Berater und Pointcut in verschiedene Beans zu deklarieren. Sie könnenNameMatchMethodPointcutAdvisor verwenden, um beide zu einer einzigen Bohne zu kombinieren.
2. Pointcut - Beispiel für einen regulären Ausdruck
Sie können den Namen der Methode auch mit dem Pointcut für reguläre Ausdrücke -RegexpMethodPointcutAdvisor abgleichen.
.*URL.*
Jetzt fängt es die Methode ab, deren Methodenname die Wörter "URL" enthält. In der Praxis können Sie damit die DAO-Schicht verwalten, wobei Sie ".*DAO. *" deklarieren können, um alle Ihre DAO-Klassen abzufangen und die Transaktion zu unterstützen.
Quellcode herunterladen
Laden Sie es herunter -Spring-AOP-Pointcuts-Advisor-Example.zip