(Programacin Orientada a Aspectos) Mayer Horna Garca 08 de febrero de 2010 copyright 2010 mayer@lima-ti.com mayer.horna@gmail.com http://www.linkedin.com/in/mayerhorna http://mayerhorna.blogspot.com @mayerhorna http://osum.sun.com/group/springperu http://spring.pe
Objetivos Entender: Que es AOP En que nos ayuda AOP Como apoya AOP a la POO Como se integra con Spring Framework
Agenda Evolucin del software Qu es AOP? Conceptos bsicos de AOP Demos con AspectJ Demo con Spring Framework
Evolucin del Software 1 Generacin: Cdigo espaghetti No exista un orden al programar. En conclusin: era difcil dar mantemiento al programa cuando este creca.
ventas.cpp Evolucin del Software 2 y 3 Generacin: Descomposicin funcional Se modulariz agrupando funciones
Sub grabarCliente( Codigo As String, Apellido As String, Nombre As String, Calle As String, Ciudad As String,
) 'Codigo para grabar Clientes End Sub Que ocurra si mas adelante, se decide que el cliente no debe registrar Ciudad ni Pais, y S un campo llamado Contacto? Problema: Se hubiera tenido que modificar los parmetros en la funcin grabarCliente y en cualquier otra funcin que grabe, consulte o edite un cliente. Solucin: Encapsular estas propiedades en una estructura llamada Cliente. Estaremos hablando de Clases y Objetos??? Evolucin del Software 4 Generacin: Descomposicin en objetos Permiti encapsular funcionalidad en Clases
public void grabarCliente(Cliente objCliente){ //Codigo para grabar Clientes } ClienteServiceImpl.java Cliente -codigo:String -apellido:String -nombre:String
+getNombre():String
Evolucin del Software 5 Generacin?: Descomposicin de aspectos. Una quinta generacin? Permite desacoplar funcionalidades del sistema, y trabajarlas de manera transversal. Como por ejemplo, la audtora del sistema, la seguridad, la transaccioanlidad, etc.
Problema: ClienteServiceImpl.java Supongamos que el mtodo grabarCliente debe tener las siguientes funcionalidades: 1) Verifica si el usuario en sesin tiene o no permiso para grabar clientes. Si pasa la validacin, entonces: 2) Inicia la transaccin con la base de datos. 3) Graba el nuevo cliente en tabla. 4) Graba en la tabla de auditoria que un nuevo registro ha sido aadido a la tabla cliente, indicando cual es el usuario responsable de la operacin. 5) Hacer commit o rollback a la transaccin, dependiendo de si fue exitosa o fallida la operacin.
Partiendo de la premisa anterior Si pensamos en separacin de aspectos, llegamos a la conclusin de que:
Supongamos que el mtodo grabarCliente debe tener las siguientes funcionalidades: 1) Verifica si el usuario en sesin tiene o no permiso para generar clientes. Si pasa la validacin, entonces: 2) Inicia la transaccin con la base de datos. 3) Graba el nuevo cliente en tabla. 4) Graba en la tabla de auditoria que un nuevo registro ha sido aadido a la tabla cliente, indicando cual es el usuario responsable de la operacin. 5) Hacer commit o rollback a la transaccin, dependiendo de si fue exitosa o fallida la operacin.
1)Aspecto: Seguridad A s p e c t o :
T r a n s a c c i o n a l i d a d
2 )
y
5 )
A s p e c t o :
A u d i t o r i a
4 )
Objetivo Principal Partiendo de la premisa anterior(En el Cdigo) Si pensamos en separacin de aspectos, llegamos a la conclusin de que:
1)Aspecto: Seguridad A s p e c t o :
T r a n s a c c i o n a l i d a d
2 )
y
5 )
A s p e c t o :
A u d i t o r i a
4 )
Objetivo Principal Partiendo de la premisa anterior(En el Cdigo) As debera ser nuestro cdigo, optimizado con AOP:
1)Aspecto: Seguridad A s p e c t o :
T r a n s a c c i o n a l i d a d
2 )
y
5 )
A s p e c t o :
A u d i t o r i a
4 )
Solo debemos preocuparnos en el objetivo principal, que es grabar un registro de cliente. Y lo dems separarlo como aspectos Qu es AOP? Paradigma de programacin cuya intencin es permitir una adecuada modularizacin de las aplicaciones y posibilitar una mejor separacin de componentes.
Es un complemento para la programacin orientada a objetos (OOP).
Por medio de AOP podemos modificar dinmicamente un modelo esttico a fin de incluir funcionalidades secundarias (transaccionalidad, seguridad, auditoria, etc).
El mtodo saveCustomer(), realiza las siguientes funcionalidades: 1) graba un registro en la tabla customer . 2) graba constancia de registro en la tabla auditoria Aplicacin sin separacin de aspectos: Como observan este proceso 2), se repetira para tantos mtodos de grabado requieran que se registre auditora. El mtodo saveCustomer(), realiza las siguientes funcionalidades: 1) graba un registro en la tabla customer . Aplicacin con separacin de aspectos: Como observan el aspecto auditora es separado y manejado de manera transversal. Beneficios: Cdigo mas limpio La referencia al objeto AuditDAOImpl ya no aparece en CustomerServiceImpl. Una mejor modularizacin. El metodo saveCustomer solo se enfoca en su objetivo principal que es grabar un registro en la tabla customer Antes de empezar, entendamos algunos conceptos AOP Aspect(Aspecto). Es la funcionalidad o caracterstica que vamos a separar (Por ejemplo: Auditora). PointCut(Punto de Corte). Define donde se aplicar el aspecto. Se especifica mediante Expresiones Regulares o mediante patrones de nombres (de clases, mtodos o campos). Ejemplo:
Advice. Indica que se va hacer en el momento (before, after,etc) que se aplique el aspecto. Before After returning After throwing After Around
Antes de empezar, entendamos algunos conceptos AOP AspectJ AspectJ es un lenguaje de programacin orientado por aspectos construido como una extensin del lenguaje Java creado en Xerox PARC. Los aspectos en si se escriben en Java extendido generndose un archivo java o compilado con cdigo de mquina compatible con el generado por los compiladores de Java. Existen otros lenguajes de AOP, como: COOL, Aspect, Aspyct
Spring Framework Es un framework para el desarrollo de aplicaciones java basado en la tcnica de Inversin de Control (IoC) y una implementacin de desarrollo segn el paradigma de Orientacin a Aspectos(AOP). Spring AOP Es un mdulo de Spring Framework que te permite hacer programacin orientada a aspectos. Integra a AspectJ, y puedes utilizarlo de manera mas sencilla.
Sintaxis AspectJ pointcut
Demo demo01: Creando un proyecto AspectJ uso de pointcut y advice aspecto aplicado antes de la ejecucin del cuerpo de un mtodo proyecto: demos_aop Demo demo02: Aspecto aplicado despus del llamado de un mtodo (Diferencias entre call y execution) Ver los .class generados y comparar diferencias proyecto: demos_aop Demo demo03: Aspecto aplicado antes y despus de la ejecucin del cuerpo de un mtodo Ver los .class generados y observar el cdigo generado proyecto: demos_aop Demo demo04: Aspecto aplicado de tipo around Uso de proceed() para ejecutar el cuerpo del mtodo Ver los .class generados y comparar diferencias proyecto: demos_aop Demo demo05: Aspecto aplicado de tipo after solo si el mtodo arroja una exepcin ( after() throwing () ) probar throwing(ArithmeticException ex) u otras excep. Ver los .class generados y comparar diferencias proyecto: demos_aop Demo demo06: Aspecto aplicado de forma genrica a un conjunto de mtodos que cumplen un mismo patrn. Uso de expresiones de AspectJ en los pointcut proyecto: demos_aop Demo demo07: Aspecto aplicado de forma genrica a un conjunto de mtodos que cumplen un mismo patrn y que dichos mtodos tienen un parmetro en su declaracin. Uso de expresiones de AspectJ en los pointcut proyecto: demos_aop Demo demo08: Aspecto aplicado de forma genrica a un conjunto de mtodos que cumplen un mismo patrn y que dichos mtodos tienen mas de un parmetro en su declaracin. Uso de expresiones de AspectJ en los pointcut proyecto: demos_aop Demo demowebconaop_base: Proyecto web(Servlets y JSP) sin aspectos Tarea: Aplicar un aspecto Solucin: proyecto: demowebconaop_base _solucion
proyecto: demowebconaop_base Y que tiene que ver AOP con Spring? Spring es un framework contenedor liviano basado en la tcnica de Inversin de Control (IoC) y una implementacin de desarrollo segn el paradigma de Orientacin a Aspectos(AOP). Spring AOP Orientacin a Aspectos(AOP): presenta una estructura simplificada para el desarrollo y utilizacin de aspectos.