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

Exemple de Spring AOP

a donné Spring1.2Ancien AOP démonstration d'implémentation basée sur dtd.

Bien que dans Spring 3Bien que pris en charge, l'utilisation de advice est expliquée sur la page suivante où l'utilisation de Spring AOP avec AspectJ sera apprise.

spring1.2Soutenu dans les implémentations anciennes d'AOP4Ces types d'Advice.

Before AdviceQui s'exécute avant l'appel de la méthode réelle. After AdviceQui s'exécute après l'appel de la méthode réelle. S'il y a une valeur de retour de la méthode, l'Advice est exécuté après la valeur de retour. Around AdviceQui s'exécute avant et après l'appel de la méthode réelle. Throws AdviceSi la méthode réelle lève une exception, l'Advice est exécuté.

Remarque: Pour comprendre les concepts de base de Spring AOP, visitez la page précédente.

Hiérarchie des conseils

Comprendre la hiérarchie des conseils à travers le graphique suivant:

Tous sont des interfaces dans AOP.

MethodBeforeAdvice L'interface étend BeforeAdvice L'interface.

AfterReturningAdvice L'interface étend AfterAdvice L'interface.

ThrowsAdvice L'interface étend AfterAdvice L'interface.

MethodInterceptor L'interface étend Interceptor L'interface. Elle est utilisée autour de l'Advice.

1Exemple de MethodBeforeAdvice

Créez une classe contenant la logique métier réelle.

Fichier: A.java

package com.w3codebox;
public class A {
public void m(){System.out.println("logique métier réelle");}
}

Maintenant, créez une classe conseillère qui implémente l'interface MethodBeforeAdvice.

Fichier: BeforeAdvisor.java

package com.w3codebox;
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
public class BeforeAdvisor implements MethodBeforeAdvice{
	@Override
	public void before(Method method, Object[] args, Object target) throws Throwable {
		System.out.println("concern supplémentaire avant la logique réelle");
	}
}

Dans le fichier xml, créez3Un bean, un pour la classe A, un autre pour la classe Advisor, et un troisième pour ProxyFactoryBean La classe.

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:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="obj" class="com.w3codebox.A"></bean>
<bean id="ba" class="com.w3codebox.BeforeAdvisor"></bean>
<bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="obj"></property>
<property name="interceptorNames">
<list>
<value>ba</value>
</list>
</property>
</bean>
</beans>

Comprendre la classe ProxyFactoryBean:

ProxyFactoryBean La classe est fournie par le framework Spring. Elle contient2Les propriétés target et interceptorNames. L'instance de la classe A sera considérée comme l'objet cible, et l'instance de la classe Advisor sera considérée comme l'intercepteur. Vous devez transmettre l'objet conseiller en tant qu'objet de liste comme dans le fichier xml fourni ci-dessus.

L'écriture de la classe ProxyFactoryBean est la suivante:

public class ProxyFactoryBean{
private Object target;
private List interceptorNames;
//getters et setters
}

Maintenant, appelons la méthode réelle.

Fichier: Test.java

package com.w3codebox;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
public class Test {
public static void main(String[] args) {
	Resource r=new ClassPathResource("applicationContext.xml");
	BeanFactory factory=new XmlBeanFactory(r);
	A a=factory.getBean("proxy",A.class);
	a.m();
}
}

Sortie

concern additionnelle avant la logique réelle
logique métier réelle

Dans MethodBeforeAdvice, nous pouvons imprimer d'autres informations, telles que le nom de la méthode, les paramètres de la méthode, l'objet cible, le nom de la classe de l'objet cible, la classe d'interception, etc.

Vous devez seulement modifier deux classes BeforeAdvisor.java et Test.java.

Fichier: BeforeAdvisor.java

package com.w3codebox;
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
public class BeforeAdvisor implements MethodBeforeAdvice{
	@Override
	public void before(Method method, Object[] args, Object target) throws Throwable {
		System.out.println("concern supplémentaire avant la logique réelle");
		System.out.println("infos de méthode: ");+method.getName()+" "+method.getModifiers());
		System.out.println("infos d'argument:");
		for(Object arg:args)
			System.out.println(arg);
		System.out.println("cible Object: ");+cible);
		System.out.println("nom de la classe cible: ");+cible.getClass().getName());
	}
}

Fichier: Test.java

package com.w3codebox;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
public class Test {
public static void main(String[] args) {
	Resource r=new ClassPathResource("applicationContext.xml");
	BeanFactory factory=new XmlBeanFactory(r);
	A a=factory.getBean("proxy",A.class);
        System.out.println("nom de la classe proxy: ");+a.getClass().getName());
	a.m();
}
}

Sortie

nom de la classe proxy: com.w3codebox.A$EnhancerByCGLIB$409872b1
concern additionnelle avant la logique réelle
infos de méthode:m 1
infos d'argument:
cible Object:com.w3codebox.A@11dba45
nom de la classe cible: com.w3codebox.A
logique métier réelle

Exemple d'AfterReturningAdvice

Créez une classe contenant la logique métier réelle.

Fichier: A.java

Comme dans l'exemple précédent.

Maintenant, créez une classe conseillère implémentant l'interface AfterReturningAdvice.

Fichier: AfterAdvisor.java

package com.w3codebox;
import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;
public class AfterAdvisor implements AfterReturningAdvice{
	@Override
	public void afterReturning(Object returnValue, Method method,
         Object[] args, Object target) throws Throwable {
		System.out.println("concern supplémentaire après le retour de l'avis");
	}
}

Créez un fichier xml comme dans les exemples précédents, vous devez simplement changer la classe du programme conseiller ici.

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:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="obj" class="com.w3codebox.A"></bean>
<bean id="ba" class="com.w3codebox.AfterAdvisor"></bean>
<bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="obj"></property>
<property name="interceptorNames">
<list>
<value>ba</value>
</list>
</property>
</bean>
</beans>

Fichier: Test.java

Comme dans l'exemple précédent.

Sortie

logique métier réelle
concern supplémentaire après le retour de l'avis

3)Exemple de MethodInterceptor(AroundAdvice)

Créez une classe contenant la logique métier réelle.

Fichier: A.java

Comme dans l'exemple précédent.

Maintenant, créez une classe conseillère qui implémente l'interface MethodInterceptor.

Fichier: AroundAdvisor.java

package com.w3codebox;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class AroundAdvisor implements MethodInterceptor{
	@Override
	public Object invoke(MethodInvocation mi) throws Throwable {
		Object obj;
		System.out.println("concern supplémentaire avant la logique réelle");
		obj = mi.proceed();
		System.out.println("concern supplémentaire après la logique réelle");
		return obj;
	}
}

Créez un fichier xml comme dans les exemples précédents, vous devez simplement changer la classe du programme conseiller ici.

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:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="obj" class="com.w3codebox.A"></bean>
<bean id="ba" class="com.w3codebox.AroundAdvisor"></bean>
<bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="obj"></property>
<property name="interceptorNames">
<list>
<value>ba</value>
</list>
</property>
</bean>
</beans>

Fichier: Test.java

Comme dans l'exemple précédent.

Sortie

concern additionnelle avant la logique réelle
logique métier réelle
concern additionnelle après la logique réelle

4Exemple de ThrowsAdvice

Créez une classe contenant la logique métier réelle.

Fichier: Validator.java

package com.w3codebox;
public class Validator {
	public void validate(int age)throws Exception{
		if(age<18){
			throw new ArithmeticException("Âge non valide");
		}
		else{
			System.out.println("vote confirmé");
		}
	}
}

Maintenant, créez une classe conseillère implémentant l'interface ThrowsAdvice.

Fichier: ThrowsAdvisor.java

package com.w3codebox;
import org.springframework.aop.ThrowsAdvice;
public class ThrowsAdvisor implements ThrowsAdvice{
	public void afterThrowing(Exception ex){
		System.out.println("concern additionnelle si une exception se produit");
	}
}

Créez un fichier xml comme dans l'exemple précédent, vous devez simplement changer les classes Validator et Advisor.

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:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="obj" class="com.w3codebox.Validator"></bean>
<bean id="ba" class="com.w3codebox.ThrowsAdvisor"></bean>
<bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="obj"></property>
<property name="interceptorNames">
<list>
<value>ba</value>
</list>
</property>
</bean>
</beans>

Fichier: Test.java

package com.w3codebox;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
public class Test {
public static void main(String[] args) {
	Resource r=new ClassPathResource("applicationContext.xml");
	BeanFactory factory=new XmlBeanFactory(r);
	Validator v=factory.getBean("proxy",Validator.class);
	try{
	v.validate(12);
	}catch(Exception e){e.printStackTrace();}
}
}

Sortie

java.lang.ArithmeticException: Âge non valide
concern additionnel si une exception se produit
	at com.w3codebox.Validator.validate(Validator.java:7)
	at com.w3codebox.Validator$FastClassByCGLIB$562915cf.invoke(<generated>)
	at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)
	at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invoke
Joinpoint(Cglib2AopProxy.java:692)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.
proceed(ReflectiveMethodInvocation.java:150)
	at org.springframework.aop.framework.adapter.ThrowsAdviceInterceptor.
invoke(ThrowsAdviceInterceptor.java:124)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.
proceed(ReflectiveMethodInvocation.java:172)
	at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.
intercept(Cglib2AopProxy.java:625)
	at com.w3codebox.Validator$EnhancerByCGLIB$4230ed28.validate(<generated>)
	at com.w3codebox.Test.main(Test.java:15)