English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Spring vous permet de définir les aspects, les avis et les points de coupe dans un fichier XML.
Dans la page précédente, nous avons vu des exemples d'AOP utilisant des annotations. Maintenant, nous verrons le même exemple à travers un fichier de configuration XML.
Voyons les éléments XML utilisés pour définir l'avis.
aop: before
Appliqué avant l'appel de la méthode de logique métier réelle.
aop: après
Appliqué après l'appel de la méthode de logique métier réelle.
aop: après retour
Appliqué après l'appel de la méthode de logique métier réelle. Il peut être utilisé pour intercepter la valeur de retour dans la notification.
aop: autour
Appliqué avant et après l'appel de la méthode de logique métier réelle.
aop: après lancement
Appliquez-le si la méthode de logique métier réelle lève une exception.
Appliquons l'avis AspectJ avant le pointCut avant la méthode de logique métier réelle. Vous pouvez effectuer toute action ici, par exemple la conversion, l'authentification, etc.
Créons une classe qui contient la logique métier réelle.
Fichier: Operation.javapackage com.w;3codebox; public class Operation{ public void msg(){System.out.println("msg method invoked");} public int m(){System.out.println("m method invoked");return 2;} public int k(){System.out.println("k method invoked");return 3;} }
Maintenant, créons une classe qui contient l'aspect avant l'avis.
Fichier: TrackOperation.java
package com.w;3codebox; import org.aspectj.lang.JoinPoint; public class TrackOperation{ public void myadvice(JoinPoint jp)//c'est un conseil { System.out.println("concern supplémentaire"); //System.out.println("Signature de la méthode: "); + jp.getSignature()); } }
现在创建定义bean的applicationContext.xml文件。
Fichier: applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance xmlns:aop="http://www.springframework.org/schema/aop xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> <aop:aspectj-autoproxy /> <bean id="opBean" class="com.w3codebox.Operation"> </bean> <bean id="trackAspect" class="com.w3codebox.TrackOperation"></bean> <aop:config> <aop:aspect id="myaspect" ref="trackAspect" > <!-- @Before --> <aop:pointcut id="pointCutBefore" expression="execution(* com.w3codebox.Operation.*(..))" /> <aop:before method="myadvice" pointcut-ref="pointCutBefore" /> </aop:aspect> </aop:config> </beans>
Maintenant, appelons la méthode réelle.
Fichier: Test.java
package com.w;3codebox; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test{ public static void main(String[] args){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Operation e = (Operation) context.getBean("opBean"); System.out.println("calling msg..."); e.msg(); System.out.println("calling m..."); e.m(); System.out.println("calling k..."); e.k(); } }
Sortie
calling msg... concern supplémentaire msg() method invoked calling m... concern supplémentaire m() method invoked calling k... concern supplémentaire k() method invoked
Comme vous pouvez le voir, avant d'appeler les méthodes msg(), m() et k(), d'autres problèmes sont également affichés.
Après l'appel de la méthode de logique métier réelle, l'AspectJ après la notification a été appliquée. Il peut être utilisé pour maintenir le journal, la sécurité, les notifications, etc.
Ici, nous supposons
Operation.java
,
TrackOperation.java
和
Test.java
文件与aop: 中的示例相同。
现在创建定义bean的applicationContext.xml文件。
Fichier: applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance xmlns:aop="http://www.springframework.org/schema/aop xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> <aop:aspectj-autoproxy /> <bean id="opBean" class="com.w3codebox.Operation"> </bean> <bean id="trackAspect" class="com.w3codebox.TrackOperation"></bean> <aop:config> <aop:aspect id="myaspect" ref="trackAspect" > <!-- @After --> <aop:pointcut id="pointCutAfter" expression="execution(* com.w3codebox.Operation.*(..))" /> <aop:after method="myadvice" pointcut-ref="pointCutAfter" /> </aop:aspect> </aop:config> </beans>
Sortie
calling msg... msg() method invoked concern supplémentaire calling m... m() method invoked concern supplémentaire calling k... k() method invoked concern supplémentaire
您可以看到在调用msg(),m()和k()方法之后,还会出现其他问题。
通过在返回建议后使用,我们可以在建议中获得结果。
创建
Fichier: Operation.java
package com.w;3codebox; public class Operation{ public int m(){System.out.println("m() method invoked");return 2;} public int k(){System.out.println("k() method invoked");return 3;} }
创建返回建议后包含的方面类。
Fichier: TrackOperation.java
package com.w;3codebox; import org.aspectj.lang.JoinPoint; public class TrackOperation{ public void myadvice(JoinPoint jp,Object result)//it is advice (after advice) { System.out.println("concern supplémentaire"); System.out.println("Signature de la méthode: "); + jp.getSignature()); System.out.println("Result in advice: ")+result); System.out.println("end of after returning advice..."); } }
Fichier: applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance xmlns:aop="http://www.springframework.org/schema/aop xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> <aop:aspectj-autoproxy /> <bean id="opBean" class="com.w3codebox.Operation"> </bean> <bean id="trackAspect" class="com.w3codebox.TrackOperation"></bean> <aop:config> <aop:aspect id="myaspect" ref="trackAspect" > <!-- @AfterReturning --> <aop:pointcut id="pointCutAfterReturning" expression="execution(* com.w3codebox.Operation.*(..))" /> <aop:after-returning method="myadvice" returning="result" pointcut-ref="pointCutAfterReturning" /> </aop:aspect> </aop:config> </beans>
Fichier: Test.java
Maintenant, créer la classe Test pour appeler la méthode réelle.
package com.w;3codebox; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test{ public static void main(String[] args){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Operation e = (Operation) context.getBean("opBean"); System.out.println("calling m..."); System.out.println(e.m()); System.out.println("calling k..."); System.out.println(e.k()); } }
Sortie
calling m... m() method invoked concern supplémentaire Method Signature: int com.w3codebox.Operation.m() Result in advice: 2 end of after returning advice... 2 calling k... k() method invoked concern supplémentaire Method Signature: int com.w3codebox.Operation.k() Result in advice: 3 end of after returning advice... 3
您可以看到返回值被打印两次,一次是由TrackOperation类打印,第二次是Test类。
AspectJ围绕建议是在调用实际的业务逻辑方法之前和之后应用的。
创建一个类
Fichier: Operation.java
package com.w;3codebox; public class Operation{ public void msg(){System.out.println("msg() is invoked");} public void display(){System.out.println("display() is invoked");} }
创建包含围绕建议的方面类。
您需要在advice方法中传递
PreceedingJoinPoint
引用,以便我们可以通过调用proceed来进行请求()方法。
Fichier: TrackOperation.java
package com.w;3codebox; import org.aspectj.lang.ProceedingJoinPoint; public class TrackOperation { public Object myadvice(ProceedingJoinPoint pjp) throws Throwable { System.out.println("Additional Concern Before calling actual method"); Object obj=pjp.proceed(); System.out.println("Additional Concern After calling actual method"); return obj; } }
Fichier: applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance xmlns:aop="http://www.springframework.org/schema/aop xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> <aop:aspectj-autoproxy /> <bean id="opBean" class="com.w3codebox.Operation"> </bean> <bean id="trackAspect" class="com.w3codebox.TrackOperation"></bean> <aop:config> <aop:aspect id="myaspect" ref="trackAspect" > <!-- @Around --> <aop:pointcut id="pointCutAround" expression="execution(* com.w3codebox.Operation.*(..))" /> <aop:around method="myadvice" pointcut-ref="pointCutAround" /> </aop:aspect> </aop:config> </beans>
Fichier: Test.java
Maintenant, créer la classe Test pour appeler la méthode réelle.
package com.w;3codebox; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test{ public static void main(String[] args){ ApplicationContext context = new classPathXmlApplicationContext("applicationContext.xml"); Operation op = (Operation) context.getBean("opBean"); op.msg(); op.display(); } }
Sortie
Concern supplémentaire avant l'appel de la méthode réelle msg() is invoked Concern supplémentaire après l'appel de la méthode réelle Concern supplémentaire avant l'appel de la méthode réelle display() est invoqué Concern supplémentaire après l'appel de la méthode réelle
Vous pouvez voir que d'autres questions sont également imprimées avant et après l'appel de msg() et de la méthode affichage.
En utilisant l'advice après l'exception, nous pouvons imprimer l'exception dans la classe TrackOperation. Voici un exemple de conseil AspectJ AfterThrowing.
Créer une classe contenant la logique métier.
Fichier: Operation.java
package com.w;3codebox;
public class Operation{
public void validate(int age)throws Exception{
if(age<18){
throw new ArithmeticException("Âge non valide");
}
else{
System.out.println("Merci pour vote");
}
}
}
Créer une classe aspect contenant la suggestion déclenchée après.
Ici, nous devons également transmettre une référence à Throwable afin que nous puissions intercepter les exceptions ici.
Fichier: TrackOperation.java
package com.w;3codebox; import org.aspectj.lang.JoinPoint; public class TrackOperation{ public void myadvice(JoinPoint jp,Throwable error)//c'est un conseil { System.out.println("concern supplémentaire"); System.out.println("Signature de la méthode: "); + jp.getSignature()); System.out.println("L'exception est: ");+error); System.out.println("fin de after throwing advice..."); } }
Fichier: applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance xmlns:aop="http://www.springframework.org/schema/aop xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> <aop:aspectj-autoproxy /> <bean id="opBean" class="com.w3codebox.Operation"> </bean> <bean id="trackAspect" class="com.w3codebox.TrackOperation"></bean> <aop:config> <aop:aspect id="myaspect" ref="trackAspect" > <!-- @AfterThrowing --> <aop:pointcut id="pointCutAfterThrowing" expression="execution(* com.w3codebox.Operation.*(..))" /> <aop:after-throwing method="myadvice" throwing="error" pointcut-ref="pointCutAfterThrowing" /> </aop:aspect> </aop:config> </beans>
Fichier: Test.java
Maintenant, créer la classe Test pour appeler la méthode réelle.
package com.w;3codebox; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test{ public static void main(String[] args){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Operation op = (Operation) context.getBean("opBean"); System.out.println("Appel de validate..."); try{ op.validate(19); }catch(Exception e){System.out.println(e);} System.out.println("Appel de validate à nouveau..."); try{ op.validate(11); }catch(Exception e){System.out.println(e);} } }
Sortie
Appel de validate... Merci de votre vote Appel de validate à nouveau... concern supplémentaire Signature de méthode : void com.w3codebox.Operation.validate(int) L'exception est : java.lang.ArithmeticException: Age non valide ... fin de l'avis après l'exception lancée... java.lang.ArithmeticException: Age non valide