spring aop –versión 2 - pbworks · 2008. 4. 10. · introducción aop...

25
1 SPRING FRAMEWORK 2.X Spring AOP – Versión 2.x 4 de Abril de 2008

Upload: others

Post on 21-Aug-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Spring AOP –Versión 2 - PBworks · 2008. 4. 10. · Introducción AOP Conprogramaciónorientadaaobjetoslasposiblessoluciones paraimplementarestos“cross-cuttingconcern ”(asuntosdecarácteruniversal

1 SPRING FRAMEWORK 2.X

Spring AOP – Versión 2.x

4 de Abril de 2008

Page 2: Spring AOP –Versión 2 - PBworks · 2008. 4. 10. · Introducción AOP Conprogramaciónorientadaaobjetoslasposiblessoluciones paraimplementarestos“cross-cuttingconcern ”(asuntosdecarácteruniversal

Spring - AOP

2 SPRING FRAMEWORK 2.X

Spring - AOP

Page 3: Spring AOP –Versión 2 - PBworks · 2008. 4. 10. · Introducción AOP Conprogramaciónorientadaaobjetoslasposiblessoluciones paraimplementarestos“cross-cuttingconcern ”(asuntosdecarácteruniversal

Croscutting Concern

3 SPRING FRAMEWORK 2.X

Page 4: Spring AOP –Versión 2 - PBworks · 2008. 4. 10. · Introducción AOP Conprogramaciónorientadaaobjetoslasposiblessoluciones paraimplementarestos“cross-cuttingconcern ”(asuntosdecarácteruniversal

Introducción AOP

� Con programación orientada a objetos las posibles soluciones para implementar estos “cross-

cutting concern” (asuntos de carácter universal) pasan por la herencia y la delegación.

� Con la herencia se puede llegar a una jerarquía de objetos complicada.

� Con la delegación la solución es complicada y requiere de llamadas duplicadas al objeto

delegado.

� AOP permite definir la funcionalidad común en un único punto. Declarativamente se define

cómo y dónde esta funcionalidad es aplicada sin la necesidad de modificar la clase a la que

aplicas la nueva funcionalidad.

4 SPRING FRAMEWORK 2.X

aplicas la nueva funcionalidad.

Page 5: Spring AOP –Versión 2 - PBworks · 2008. 4. 10. · Introducción AOP Conprogramaciónorientadaaobjetoslasposiblessoluciones paraimplementarestos“cross-cuttingconcern ”(asuntosdecarácteruniversal

Terminología AOP

� Aspect: Funcionalidad genérica que se está implementando. Ej: Seguridad, logging, etc…

� Joinpoint: Punto de la ejecución de un programa donde un aspecto puede ser introducido.

� Advice: Implementación actual de un Aspect.

� Pointcut: Define en qué joinpoints va a ser aplicado el advice. Normalmente se indicará

clases explícitas y un nombre de método, pero también es posible definir expresiones

regulares que definen patrones para nombres de clases y nombres de métodos. Además es

posible en algunos AOP frameworks definir un pointcut en tiempo de ejecución.

5 SPRING FRAMEWORK 2.X

posible en algunos AOP frameworks definir un pointcut en tiempo de ejecución.

Page 6: Spring AOP –Versión 2 - PBworks · 2008. 4. 10. · Introducción AOP Conprogramaciónorientadaaobjetoslasposiblessoluciones paraimplementarestos“cross-cuttingconcern ”(asuntosdecarácteruniversal

Terminología AOP (II)

6 SPRING FRAMEWORK 2.X

Page 7: Spring AOP –Versión 2 - PBworks · 2008. 4. 10. · Introducción AOP Conprogramaciónorientadaaobjetoslasposiblessoluciones paraimplementarestos“cross-cuttingconcern ”(asuntosdecarácteruniversal

Terminología AOP (III)

� Introducción: Permite añadir atributos y métodos a clases existentes.Ejemplo: Auditable advice

� Target: Clase a la que se le aplica un aspecto.

� Proxy: Es el objeto creado después de aplicar un aspecto a un objeto target.

� Weaving: Es el proceso de aplicar aspectos a objetos targets para crear un nuevo objetoproxy. Los aspectos son “tejidos” (woven) dentro de los objetos target en los especificadosjoinpoints.

� El proceso de “tejido” puede realizarse en los siguientes momentos:

7 SPRING FRAMEWORK 2.X

� El proceso de “tejido” puede realizarse en los siguientes momentos:

� Tiempo de compilación: Requiere un compilador especial.

� Tiempo de carga de clase: Aspectos son tejidos cuando el objeto target es cargadodentro de la JVM. Requiere un classloader especial que aumente el bytecode de laclase target antes de que la clase sea introducida dentro de la aplicación

� Tiempo de ejecución. El contenedor AOP genera en proxy en tiempo de ejecución.

Page 8: Spring AOP –Versión 2 - PBworks · 2008. 4. 10. · Introducción AOP Conprogramaciónorientadaaobjetoslasposiblessoluciones paraimplementarestos“cross-cuttingconcern ”(asuntosdecarácteruniversal

Soporte AOP en Spring

� Actualmente hay tres frameworks AOP:

� AspectJ (http://eclipse.org/aspectj)

� Jboss AOP (http://labs.jboss.com/portal/jbossaop/index.html)

� Spring AOP (http://www.springframework.org)

� El soporte de AOP con Spring tiene cuatro alternativas:

� Spring AOP basados en proxies en tiempo de ejecución (disponible en todas las versiones de Spring)

� Aspectos AspectJ dirigidos a anotaciones (sólo disponible en la versión 2.x de Spring)

8 SPRING FRAMEWORK 2.X

� Aspectos POJO puros (sólo disponible en la versión 2.x de Spring)

� Aspectos AspectJ inyectados (disponible en todas las versiones de Spring)

� Los tres primeros sólo permiten intercepción a nivel de método. El cuarto permite inyección

a nivel de constructor y atributo (raramente requeridos).

Page 9: Spring AOP –Versión 2 - PBworks · 2008. 4. 10. · Introducción AOP Conprogramaciónorientadaaobjetoslasposiblessoluciones paraimplementarestos“cross-cuttingconcern ”(asuntosdecarácteruniversal

Implementación AOP en Spring

� Los frameworks de AOP son diversos. Algunos presentan la funcionalidad de aplicar aspectos

cuando se modifica el valor de un atributo, mientras que otros se quedan al nivel de

invocación de métodos (soporte Spring).

� Nos centraremos en cómo Spring permite implementar AOP.

� Los advice de Spring están escritos en Java.

� Los pointcuts son definidos via XML dentro de la configuración de Spring.

� Spring aplica los aspectos en tiempo de ejecución. Genera el proxy cuando se carga el bean

dentro del BeanFactory. No es necesario ningún compilador especial.

9 SPRING FRAMEWORK 2.X

dentro del BeanFactory. No es necesario ningún compilador especial.

Page 10: Spring AOP –Versión 2 - PBworks · 2008. 4. 10. · Introducción AOP Conprogramaciónorientadaaobjetoslasposiblessoluciones paraimplementarestos“cross-cuttingconcern ”(asuntosdecarácteruniversal

Implementación AOP en Spring

� Generación de proxies:

� Si la clase target cumple un interfaz Spring usa la clase de la JDK java.lang.reflect.Proxy.

� Si la clase target no cumple un interfaz se usa CGLIB (similar a Hibernate para las

propiedades/asociaciones perezosas). Dinámicamente se genera una subclase del target

introduciendo la lógica definida en el advice. La subclase a su vez delega la ejecución de los distintos

métodos a la clase target.

� Limitaciones a CGLIB: No pueden aplicarse aspectos a métodos marcados como final. Spring genera

una subclase de la clase target.

� Se recomienda el uso de java.lang.reflect.Proxy mediante interfaz ya que favorece el desacoplo de la

10 SPRING FRAMEWORK 2.X

� Se recomienda el uso de java.lang.reflect.Proxy mediante interfaz ya que favorece el desacoplo de la

solución.

� Spring sólo soporta joinpoints a nivel de método. AspectJ y JBossAOP soportan joinpoints a

nivel de constructor y atributo.

Page 11: Spring AOP –Versión 2 - PBworks · 2008. 4. 10. · Introducción AOP Conprogramaciónorientadaaobjetoslasposiblessoluciones paraimplementarestos“cross-cuttingconcern ”(asuntosdecarácteruniversal

Advice. Tipos

11 SPRING FRAMEWORK 2.X

Page 12: Spring AOP –Versión 2 - PBworks · 2008. 4. 10. · Introducción AOP Conprogramaciónorientadaaobjetoslasposiblessoluciones paraimplementarestos“cross-cuttingconcern ”(asuntosdecarácteruniversal

Poincut. Tipos

� Permiten definir dónde los advice son aplicados.

� Pointcuts determinan si un determinado método de una determinada clase cumple con un

criterio particular.

� Spring permite que los advice sean tejidos dentro de las clases de la aplicación de una

manera flexible.

12 SPRING FRAMEWORK 2.X

public interface Pointcut

{

public abstract ClassFilter getClassFilter();

public abstract MethodMatcher getMethodMatcher();

}

Page 13: Spring AOP –Versión 2 - PBworks · 2008. 4. 10. · Introducción AOP Conprogramaciónorientadaaobjetoslasposiblessoluciones paraimplementarestos“cross-cuttingconcern ”(asuntosdecarácteruniversal

Pointcut interfaces. ClassFilter y MethodMatcher

public interface ClassFilter

{

public abstract boolean matches(Class targetClass);

}

public interface MethodMatcher

13 SPRING FRAMEWORK 2.X

public interface MethodMatcher

{

public abstract boolean matches(Method method, Class targetClass);

public abstract boolean isRuntime();

public abstract boolean matches(Method method, Class targetClass,

Object args[]);

}

Page 14: Spring AOP –Versión 2 - PBworks · 2008. 4. 10. · Introducción AOP Conprogramaciónorientadaaobjetoslasposiblessoluciones paraimplementarestos“cross-cuttingconcern ”(asuntosdecarácteruniversal

Advisor

Advice Pointcut Advisor

14 SPRING FRAMEWORK 2.X

Page 15: Spring AOP –Versión 2 - PBworks · 2008. 4. 10. · Introducción AOP Conprogramaciónorientadaaobjetoslasposiblessoluciones paraimplementarestos“cross-cuttingconcern ”(asuntosdecarácteruniversal

Pointcut estáticos

� StaticMethodMatcherPointcut es la clase base para poder crear pointcuts estáticos. En el caso

de necesitar implementar uno propio únicamente es necesario sobreescribir esta clase e

implementar el método isMatch.

� Pointcut estáticos provistos por Spring:

� NameMatchMethodPointcut: Permite el uso de wildcard “*”

� public void setMappedName(String)

� public void setMappedNames(String[])

� Ej: set* � Todos los métodos setter

15 SPRING FRAMEWORK 2.X

� Pointcut con expresiones regulares (RegExpMethodPointcut). Permite definir expresiones regulares de

tipo Perl (concretamente las de Java) para definir los métodos que van a ser “interceptados”.

Page 16: Spring AOP –Versión 2 - PBworks · 2008. 4. 10. · Introducción AOP Conprogramaciónorientadaaobjetoslasposiblessoluciones paraimplementarestos“cross-cuttingconcern ”(asuntosdecarácteruniversal

Pointcut dinámicos

� ControlFlowPointcut: Recoge la información de la pila de llamada del thread actual. Ejemplo

podríamos interceptar la llamada de un determinado servlet mediante un

MethodBeforeAdvice.

� Este tipo de pointcut tiene asociada una penalización del rendimiento de la aplicación con

respecto a otros pointcut dinámicos. Java1.4 cinco veces más lento. Java1.3 diez veces más

lento.

� ControlFlowPointcut es el único pointcut dinámico provisto por Spring. Recordar que se

pueden desarrollar pointcut dinámicos implementando el interfaz MethodMatcher

devolviendo “true” en el método isRuntime() del mencionado interfaz.

16 SPRING FRAMEWORK 2.X

devolviendo “true” en el método isRuntime() del mencionado interfaz.

Page 17: Spring AOP –Versión 2 - PBworks · 2008. 4. 10. · Introducción AOP Conprogramaciónorientadaaobjetoslasposiblessoluciones paraimplementarestos“cross-cuttingconcern ”(asuntosdecarácteruniversal

Operaciones sobre pointcuts

� Spring permite la union y la intersección de pointcuts � ComposablePointcut.

� Se pueden combinar cualquier número de pointcut, ClassFilter y MethodMatcher.

17 SPRING FRAMEWORK 2.X

Page 18: Spring AOP –Versión 2 - PBworks · 2008. 4. 10. · Introducción AOP Conprogramaciónorientadaaobjetoslasposiblessoluciones paraimplementarestos“cross-cuttingconcern ”(asuntosdecarácteruniversal

Definiendo Pointcuts con AspectJ

� Aunque es posible aprovechar la riqueza de las expresiones regulares para definir el conjunto

de puntos de ejecución de un determinados advice, AspectJ provee un lenguaje de definición

de pointcut más fino.

� Para definir expresiones AspectJ para la definición de Pointcut es necesario usar la clase

AspectJExpressionPointcut

18 SPRING FRAMEWORK 2.X

Page 19: Spring AOP –Versión 2 - PBworks · 2008. 4. 10. · Introducción AOP Conprogramaciónorientadaaobjetoslasposiblessoluciones paraimplementarestos“cross-cuttingconcern ”(asuntosdecarácteruniversal

Introductions

� Introductions son advice que afectan en el ámbito de clase, permitiendo añadir métodos y

atributos nuevos en la clase.

� Permite los mismos beneficios que la herencia múltiple.

� IntroductionMethodInterceptor es un subinterfaz de MethodInterceptor añadiendo un método

adicional:

� boolean implementsInterface(Class intf);

� Si el método implementsInterface devuelve “true” entonces IntroductionMethodInterceptor es

responsable de implementar el mencionado interfaz. Cualquier invocación de un método

19 SPRING FRAMEWORK 2.X

responsable de implementar el mencionado interfaz. Cualquier invocación de un método

declarado en el interfaz será delegado al método invoke() de IntroductionMethodInterceptor

� CUIDADO al llamar una clase con Introduction fuera de Spring!!!

Page 20: Spring AOP –Versión 2 - PBworks · 2008. 4. 10. · Introducción AOP Conprogramaciónorientadaaobjetoslasposiblessoluciones paraimplementarestos“cross-cuttingconcern ”(asuntosdecarácteruniversal

ProxyFactoryBean

� En el caso que se quiera aplicar el mismo advice a varios componentes, es posible definir un

ProxyFactoryBean abstracto con el objeto de extender el mismo estableciendo el valor de la

propiedad target.

20 SPRING FRAMEWORK 2.X

Page 21: Spring AOP –Versión 2 - PBworks · 2008. 4. 10. · Introducción AOP Conprogramaciónorientadaaobjetoslasposiblessoluciones paraimplementarestos“cross-cuttingconcern ”(asuntosdecarácteruniversal

Autoproxying

� Cuando el número de objetos proxy es pequeño con ProxyFactoryBean es suficiente. En el

caso de aumentar el tamaño de objetos proxy es necesario que el contenedor los cree de

manera explícita, ya que la cantidad de configuración con ProxyFactoryBean es excesiva.

� Hay dos alternativas:

� Autoproxying basados en advisors declarados en el contexto de Spring.

� Autoproxying basados en aspectos con anotaciones AspectJ.

� Correspondientes al primer tipo tenemos las siguientes alternativas:

� BeanNameAutoProxyCreator: Mediante una expresión podemos identificar el conjunto de beans

21 SPRING FRAMEWORK 2.X

� BeanNameAutoProxyCreator: Mediante una expresión podemos identificar el conjunto de beans

dentro de la factoría que se quiere interceptar con un determinado advice

� DefaultAdvisorAutoProxyCreator: Sólo trabaja con advisors (ya que necesita saber a qué beans

debería aplicar el aspecto

� Consiste en un BeanPostProcessor que peina el contexto en la búsqueda de Advisor.

Page 22: Spring AOP –Versión 2 - PBworks · 2008. 4. 10. · Introducción AOP Conprogramaciónorientadaaobjetoslasposiblessoluciones paraimplementarestos“cross-cuttingconcern ”(asuntosdecarácteruniversal

BeanNameAutoProxyCreator

22 SPRING FRAMEWORK 2.X

Page 23: Spring AOP –Versión 2 - PBworks · 2008. 4. 10. · Introducción AOP Conprogramaciónorientadaaobjetoslasposiblessoluciones paraimplementarestos“cross-cuttingconcern ”(asuntosdecarácteruniversal

DefaultAdvisorAutoProxyCreator

23 SPRING FRAMEWORK 2.X

Page 24: Spring AOP –Versión 2 - PBworks · 2008. 4. 10. · Introducción AOP Conprogramaciónorientadaaobjetoslasposiblessoluciones paraimplementarestos“cross-cuttingconcern ”(asuntosdecarácteruniversal

Autoproxying basados en aspectos con anotaciones

AspectJ

� Se define el aspecto como una clase POJO normal, la cual se anota.

� Se define un método vacío al que se le asocia la expresión que define el pointcut.

� Posteriormente con las anotaciones @Before , @After y @AfterThrowing se anotan los métodos

llamados antes de la ejecución del método, después y en el caso de excepción, respectivamente.

� Es posible anotar una función con la anotación @Around a la cual se pasa un parámetro con

información asociada al joinpoint que permite invocar el método original.

� Para que funcionen correctamente este tipo de aspectos es necesario crear el bean de la clase

AnnotationAwareAspectJAutoProxyCreator

� Sin embargo, la configuración para este bean es muy farragosa, con lo que con Spring viene el

24 SPRING FRAMEWORK 2.X

� Sin embargo, la configuración para este bean es muy farragosa, con lo que con Spring viene el

elemento de configuración <aop:aspectj-autoproxy> que realiza toda la configuración de manera

interna y transparente al desarrollador. Para ello es necesario definir el namespace aop en el fichero

de configuración del contexto de Spring.

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:lang="http://www.springframework.org/schema/lang"

xmlns:aop="http://www.springframework.org/schema/aop"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd

http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-2.0.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">

Page 25: Spring AOP –Versión 2 - PBworks · 2008. 4. 10. · Introducción AOP Conprogramaciónorientadaaobjetoslasposiblessoluciones paraimplementarestos“cross-cuttingconcern ”(asuntosdecarácteruniversal

Declarando aspectos puramente POJOS

� En la version Spring 2.x el equipo de desarrollo ha decidido que la configuración de aspectos

mediante ProxyFactoryBean necesitaba demasiada configuración.

� Anteriormente se ha definido un elemento del namespace aop (<aop:aspectj-autoproxy)).

Dentro de este espacio de nombres aparecen los elementos definidos en la tabla.

� En este caso no es necesario anotar la clase que implementa el advice.

� Presenta la ventaja que cualquier clase puede convertirse en advice.

25 SPRING FRAMEWORK 2.X