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

Exemplo de Spring AOP

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.

Atenção: Para entender os conceitos básicos do Spring AOP, acesse a página anterior.

Hierarquia de 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)