English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Fornecido Spring1.2AOP antigo (Implementado com base em dtd) exemplo.
Embora no Spring 3Suportado, mas o uso de advice será aprendido na próxima página sobre a utilização conjunta de Spring AOP e AspectJ.
spring1.2suportado em implementações antigas do AOP4tipos de Advice.
Before Adviceque é executado antes da chamada do método real. After Adviceque é executado após a chamada do método real. Se o método retornar um valor, ele será executado após o valor de retorno. Around Adviceque é executado antes e após a chamada do método real. Throws Advicese o método real lançar uma exceção, execute o Advice.
Vamos entender a hierarquia de Advice através do seguinte gráfico:
todos são interfaces no AOP.
MethodBeforeAdvice interface que estende BeforeAdvice interface.
AfterReturningAdvice interface que estende AfterAdvice interface.
ThrowsAdvice interface que estende AfterAdvice interface.
MethodInterceptor interface que estende Interceptor interface. Ela é usada ao redor do Advice.
1Exemplo de MethodBeforeAdvice
Crie uma classe que contém a lógica de negócios real.
Arquivo: A.java
package com.w3codebox; public class A { public void m(){System.out.println("lógica de negócios real");} }
Agora, crie uma classe conselheira que implemente a interface MethodBeforeAdvice.
Arquivo: 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 adicional antes da lgica real"); } }
No arquivo xml, crie3um bean, um para a classe A, o segundo para a classe Advisor, e o terceiro para ProxyFactoryBean classe.
arquivo: 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>
Entenda a classe ProxyFactoryBean:
ProxyFactoryBean A classe é fornecida pelo Spring Famework. Ela contém2duas propriedades, target e interceptorNames. A instância da classe A será considerada o objeto alvo, e a instância da classe Advisor será considerada o interceptador. Você precisa passar a lista de objetos Advisor como objeto de lista, conforme especificado no arquivo xml fornecido acima.
A escrita da classe ProxyFactoryBean é a seguinte:
public class ProxyFactoryBean{ private Object target; private List interceptorNames; //getters e setters }
Agora, vamos chamar o método real.
Arquivo: 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(); } }
Saída
concern adicional antes da lógica real lógica de negócios real
Em MethodBeforeAdvice, podemos imprimir outras informações, como o nome do método, os parâmetros do método, o objeto alvo, o nome da classe do objeto alvo, a classe do proxy, etc.
Você precisa apenas modificar dois arquivos BeforeAdvisor.java e Test.java.
Arquivo: 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 adicional antes da lgica real"); System.out.println("informações do método:");+method.getName()+" "+method.getModifiers()); System.out.println("informações de argumento:"); for(Object arg:args) System.out.println(arg); System.out.println("objeto alvo:");+target); System.out.println("nome da classe do objeto alvo: ");+target.getClass().getName()); } }
Arquivo: 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("nome da classe proxy: ");+a.getClass().getName()); a.m(); } }
Saída
nome da classe proxy: com.w3codebox.A$EnhancerByCGLIB$409872b1 concern adicional antes da lógica real informações do método:m 1 informações de argumento: objeto alvo: com.w3codebox.A@11dba45 nome da classe do objeto alvo: com.w3codebox.A lógica de negócios real
Exemplo de AfterReturningAdvice
Crie uma classe que contém a lógica de negócios real.
Arquivo: A.java
igual ao exemplo anterior.
Agora, crie uma classe consultora que implemente a interface AfterReturningAdvice.
Arquivo: 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 adicional aps o retorno da consulta"); } }
Crie um arquivo xml como no exemplo anterior, voc precisa apenas alterar a classe do programa consultor neste ponto.
arquivo: 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>
Arquivo: Test.java
igual ao exemplo anterior.
Saída
lógica de negócios real concern adicional aps o retorno da consulta
3)Exemplo de MethodInterceptor(AroundAdvice)
Crie uma classe que contém a lógica de negócios real.
Arquivo: A.java
igual ao exemplo anterior.
Agora, crie uma classe consultora que implementa a interface MethodInterceptor.
Arquivo: 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 adicional antes da lgica real"); obj = mi.proceed(); System.out.println("concern adicional aps a lgica real"); return obj; } }
Crie um arquivo xml como no exemplo anterior, voc precisa apenas alterar a classe do programa consultor neste ponto.
arquivo: 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>
Arquivo: Test.java
igual ao exemplo anterior.
Saída
concern adicional antes da lógica real lógica de negócios real concern adicional após a lógica real
4exemplo de ThrowsAdvice
Crie uma classe que contém a lógica de negócios real.
arquivo: Validator.java
package com.w3codebox; public class Validator { public void validate(int age)throws Exception{ if(age<18){ throw new ArithmeticException("Idade Não Válida"); } else{ System.out.println("voto confirmado"); } } }
Agora, crie uma classe consultora que implemente a interface ThrowsAdvice.
arquivo: ThrowsAdvisor.java
package com.w3codebox; import org.springframework.aop.ThrowsAdvice; public class ThrowsAdvisor implements ThrowsAdvice{ public void afterThrowing(Exception ex){ System.out.println("concern adicional se ocorrer exceção"); } }
Crie um arquivo xml como o exemplo anterior, você precisa apenas alterar as classes Validator e Advisor.
arquivo: 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>
Arquivo: 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();} } }
Saída
java.lang.ArithmeticException: Idade Não Válida concern adicional se ocorrer exceção at com.w3codebox.Validator.validate(Validator.java:7) at com.w3codebox.Validator$FastClassByCGLIB$562915cf.invoke(<gerado>) 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)