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:
-
Correspondance de nom
-
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
Téléchargez-le -Spring-AOP-Pointcuts-Advisor-Example.zip