Exemple AOP de printemps - Pointcut, Advisor

Exemple Spring AOP - Pointcut, Advisor

Dans les derniersSpring AOP advice examples, toutes les méthodes d'une classe sont interceptées automatiquement. Mais dans la plupart des cas, vous aurez peut-être juste besoin d'un moyen d'intercepter seulement une ou deux méthodes, c'est pour cela que «Pointcut» est venu. Il vous permet d'intercepter une méthode par son nom de méthode. De plus, un «Pointcut» doit être associé à un «Advisor».

Dans Spring AOP, vient avec trois termes très techniques -Advices, Pointcut , Advisor, mettez-le de manière non officielle ...

  • Conseil - Indiquez l'action à entreprendre avant ou après l'exécution de la méthode.

  • Pointcut - Indiquez quelle méthode doit être interceptée, par nom de méthode ou modèle d'expression régulière.

  • Conseiller - Regroupez les «Conseils» et les «Pointcut» en une seule unité, et passez-les à un objet de fabrique proxy.

Revoir à nouveau lesSpring AOP advice examplesderniers.

Fichier: 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();
    }

}

Fichier: Spring-Customer.xml



    
        
        
    

    

    

        

        
            
                hijackAroundMethodBeanAdvice
            
        
    

Fichier: 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;
        }
    }
}

Exécuter

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) {
        }
    }
}

Sortie

*************************
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!

Toutes les méthodes de classe de service client sont interceptées. Plus tard, nous vous montrerons comment utiliser «pointcuts» pour intercepter uniquement la méthodeprintName().

Exemple de coupes

Vous pouvez faire correspondre la méthode de deux manières:

  1. Correspondance de nom

  2. Match de répression régulier

1. Coupes de points - Exemple de correspondance de nom

Intercepter une méthode printName () via ‘pointcut’ et ‘advisor’. Créez un bean pointcut deNameMatchMethodPointcut et placez le nom de la méthode que vous souhaitez intercepter dans la valeur de la propriété ‘mappedName’.

    
        
    

Créez un bean conseillerDefaultPointcutAdvisor et associez à la fois conseil et pointcut.

    
        
        
    

Remplacez les «interceptorNames» du proxy par «customerAdvisor» (il s’agissait de «hijackAroundMethodBeanAdvice»).

    

        

        
            
                customerAdvisor
            
        
    

Fichier de configuration complet du bean



    
        
        
    

    

    

        

        
            
                customerAdvisor
            
        
    

    
        
    

    
        
        
    

Exécutez-le à nouveau, sortie

*************************
Method name : printName
Method arguments : []
HijackAroundMethod : Before method hijacked!
Customer name : Yong Mook Kim
HijackAroundMethod : Before after hijacked!
*************************
Customer website : http://www.example.com
*************************

Maintenant, vous interceptez uniquement la méthode printName ().

PointcutAdvisor
Spring est livré avec la classePointcutAdvisor pour enregistrer votre travail afin de déclarer le conseiller et le pointer dans différents beans, vous pouvez utiliserNameMatchMethodPointcutAdvisor pour combiner les deux en un seul bean.

    

        
        

    

2. Pointcut - Exemple d'expression régulière

Vous pouvez également faire correspondre le nom de la méthode à l’aide de l’expression régulière -RegexpMethodPointcutAdvisor.

    
        
            
                .*URL.*
            
        

        
    

Maintenant, il intercepte la méthode qui a des mots «URL» dans le nom de la méthode. En pratique, vous pouvez l'utiliser pour gérer la couche DAO, où vous pouvez déclarer «.*DAO. *» pour intercepter toutes vos classes DAO pour prendre en charge la transaction.

Télécharger le code source