Spring AOP Example - Pointcut, Berater

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:

  1. Name stimmt überein

  2. 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