English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Exemple de configuration XML d'AOP Spring AspectJ

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 retourAppliqué 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 lancementAppliquez-le si la méthode de logique métier réelle lève une exception.
Attention: Pour comprendre le concept d'AOP et ses avantages, visitez ici. Tutoriel sur le concept d'AOP

1、aop: before

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.java
package 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.


2Des exemples après aop:

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()方法之后,还会出现其他问题。


3、aop: 返回后的示例

通过在返回建议后使用,我们可以在建议中获得结果。

创建

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类。


4、aop: around

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.


5、aop: after-throwing

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