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