Pequeño truquito con spring AOP con anotaciones
Saber cuánto tarda la ejecución de una sección con spring orientado a aspectos AOP y anotaciones.
Una gran ventaja es que no es invasivo
Realice este ejemplo con SpringSource Tool Suite, basando de un template de Spring Hibernate
por lo que maven bajo las siguientes librerías.
Excepto (aopalliance-1.0.jar y aspectjweaver.jar que agregue a mano)
Librerias:
antlr-2.7.6.jar
aopalliance-1.0.jar
asm-3.1.jar
aspectjrt.jar
aspectjweaver.jar
cglib-2.2.jar
commons-cli-1.0.jar
commons-collections-3.1.jar
commons-lang-2.1.jar
commons-logging-1.1.1.jar
dom4j-1.6.1.jar
h2-1.3.156.jar
hibernate-commons-annotations-3.2.0.Final.jar
hibernate-core-3.6.0.Final.jar
hibernate-entitymanager-3.6.0.Final.jar
hibernate-jpa-2.0-api-1.0.0.Final.jar
javassist-3.12.0.GA.jar
jta-1.1.jar
junit-4.7.jar
log4j-1.2.16.jar
plexus-archiver-1.0.jar
plexus-build-api-0.0.4.jar
plexus-compiler-api-1.8.1.jar
plexus-compiler-javac-1.8.1.jar
plexus-compiler-manager-1.8.1.jar
plexus-interactivity-api-1.0-alpha-4.jar
plexus-interpolation-1.13.jar
plexus-io-1.0.jar
plexus-utils-2.0.5.jar
slf4j-api-1.6.1.jar
spring-aop-3.0.6.RELEASE.jar
spring-asm-3.0.6.RELEASE.jar
spring-beans-3.0.6.RELEASE.jar
spring-context-3.0.6.RELEASE.jar
spring-context-support-3.0.6.RELEASE.jar
spring-core-3.0.6.RELEASE.jar
spring-expression-3.0.6.RELEASE.jar
spring-jdbc-3.0.6.RELEASE.jar
spring-orm-3.0.6.RELEASE.jar
spring-test-3.0.6.RELEASE.jar
spring-tx-3.0.6.RELEASE.jar
Comentario del código:
En el app-context.xml
Estas lineas habilitan el uso de anotaciones en spring
Esta línea sirve para escanear paquetes que contienen anotaciones, de esta manera nos ahorramos escribirlas como beans en el app-context.xml.
Anotaciones usadas.
@Component: Esta anotación agrega una clase al contexto de spring. equivale a agregar un
al application context
@Autowire: sobre un metodo o una propiedad Spring buscara un @Component para intentar inyectarlo, como se ve en el código en ocaciones ni siqueira es necesario agregar su "setter" setVariable()
Ahora vamos con programacion orientada a aspectos:
Estas líneas habilitan la orientación a aspectos.
@Aspect: Indica la clase en la que esta programada la acción a ejecutar
@Around("execution(* com.asf.toolkit.ej2.FooService.getData(String,int))&&" +
"args(name, age)")
public Object profile(ProceedingJoinPoint call, String name, int age) throws Throwable
@Around
Determina que ejecutara parte de la lógica antes del aspecto y después de la ejecución.
Dentro de la anotación
execution(* com.asf.toolkit.ej2.FooService.getData(String,int))
abre una expresión que le indica a Spring donde inyectar el aspecto, en este caso es al ejecutar el método de getData de una clase com.asf.toolkit.ej2.FooService
args(name, age)
Le indica que el metodo que ejectara el aspecto recibe 2 parametros que tratara de inyectar, en este caso mapeando la firma del metodo a interceptar .getData(String,int) con el metodo que ejecutará args(name, age).
El método a ejecutar
public Object profile(ProceedingJoinPoint call, String name, int age) throws Throwable
Antes de la ejecución de getData
StopWatch clock = new StopWatch(
"Profiling for '" + name + "' and '" + age + "'");
try {
clock.start(call.toShortString());
Ejecución de getData
return call.proceed();
Despues de la ejecución de getData
} finally {
clock.stop();
System.out.println(clock.prettyPrint());
}
La clase StopWatch arranca un reloj que mide la ejecución del metodo, esta clase viene contenida en aspectjweaver.jar
Main.javaSimpleProfiler.javapackage com.asf.toolkit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;
import com.asf.toolkit.ej2.FooService;
import com.asf.toolkit.service.MyBeanI;
@Component
public class Main {
public static void main(String[] args) {
Main p = new Main();
p.start(args);
}
@Autowired
private MyBeanI myBean;
private void start(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("META-INF/spring/app-context.xml");
System.out.println("------- Inicia Ej2 @Aspect, @Around");
FooService foo = (FooService) context.getBean("defaultFooService");
System.out.println(foo.getData("Pengo", 12));
}
}FooService.javapackage com.asf.toolkit.ej2;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Around;
import org.springframework.stereotype.Service;
import org.springframework.util.StopWatch;
@Component
@Aspect
public class SimpleProfiler {
@Around("execution(* com.asf.toolkit.ej2.FooService.getData(String,int))&&" +
"args(name, age)")
public Object profile(ProceedingJoinPoint call, String name, int age) throws Throwable {
StopWatch clock = new StopWatch(
"Profiling for '" + name + "' and '" + age + "'");
try {
clock.start(call.toShortString());
return call.proceed();
} finally {
clock.stop();
System.out.println(clock.prettyPrint());
}
}
}DefaultFooService.javaMETA-INF/spring/app-context.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:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xsi:schemaLocation=" http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> <context:annotation-config /> <bean class = "org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" /> <context:component-scan base-package="com.asf.toolkit.ej2" /> <!-- Configuracion AOP --> <aop:aspectj-autoproxy/> <bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator" /> </beans> ---------------------- log4j.properties: Colocar en raizlog4j.rootCategory=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n
log4j.category.org.apache.activemq=ERROR
log4j.category.org.springframework.batch=DEBUG
log4j.category.org.springframework.transaction=INFO
- paranoid_android's blog
- Inicie sesión o regístrese para enviar comentarios
Comentarios recientes
hace 8 semanas 5 días
hace 9 semanas 6 días
hace 16 semanas 4 días
hace 1 año 9 semanas
hace 2 años 21 semanas
hace 2 años 25 semanas
hace 2 años 32 semanas
hace 2 años 40 semanas
hace 2 años 43 semanas
hace 2 años 44 semanas