Spring AOP: Cacheando aplicaciones usando anotaciones y aspectos con Aspectj

2
18444



Spring AOP: Cacheando aplicaciones usando anotaciones y aspectos con Aspectj













Spring AOP: Cacheando aplicaciones usando anotaciones y aspectos con Aspectj

Introducción.

Para empezar este tutorial, os invito a observar la siguiente clase Java poniendo especial atención a los métodos getAll y add.

Ahora bien al igual que pasa en la mayoría de las aplicaciones, hay muchos métodos que siempre devuelven lo mismo (getAll) a no ser que otro método (add) invalide el mismo.

Estos métodos son claros candidatos de ser cacheados, pues ¿para qué volver a consultar a la BD y traernos los resultados por la red?,
¿para que volver a invocar un servicio web si estamos seguros de que el resultado será el mismo?. ¿Para qué….?

Pues bien, en este tutorial vamos a usar la programación orientada a aspectos para dotar con un par de simples anotaciones los métodos cuyo resultado queremos cachear y los métodos que invalidan la cache(s) establecidas.

No os voy a tratar temas teóricos sobre programación orientada a Aspectos, Spring, Maven… para eso están los libros, Internet o
los cursos que impartimos en Autentia, sólo os quiero presentar un completo ejemplo práctico de creación de un aspecto basado en Aspectj y anotaciones.

Más adelante escribiremos un test con JUnit que invoque los métodos getAll y add, observe cual será la salida de la aplicación:

Observe lo siguiente:

  • En la segunda invocación del método getAll nos ahorramos unos segundos de ejecución
    y recursos.. que hoy en día las aplicaciones a veces van más lentas que hace 8 años usando en la actualidad máquinas más potentes 😉
  • Posteriormente, una vez descacheada la información, el tiempo de ejecución de getAll vuelve a incrementarse, es decir, la caché fue limpiada.

Manos a la obra con el ejemplo:

Antes de nada, como verá en la sección referencias, hay muchas formas de hacer lo mismo, pero desde mi punto de vista esta forma que he diseñado gana en sencillez, bajo acoplamiento y esfuerzo para transladarlo a vuestros proyectos.

Os dejo el código fuente del proyecto (proyecto Eclipse, Maven) para que realiceis vuestras pruebas.

Creamos una anotación para cachear el resultado de cualquier método de nuestras aplicaciones:

Creamos una anotación para limpiar la cache creada usando la anotación anterior:

Aspecto que automáticamente será invocado en los métodos que estén anotados para ser cacheados o descacheados:

Archivo de configuración de Spring 2 (/main/resources/applicationContext.xml):

Archivo de configuración de Maven pom.xml:

Ejecuto un ejemplo a modo de test funcional:

Puede ser ejecutarlo con la sentencia: mvn test.

Referencias

Conclusiones

Como habéis podido ver la programación orientada a aspectos deja nuestro código mucho más desacoplado, centrándonos en la lógica de negocio y dejando los temas como seguridad, gestión de trazas, cacheo, etc. al margen del mismo… en este tema Spring nos proporciona un amplísimo abanico de posibilidades.

En Autentia, estamos constantemente formándonos para intentar conseguir cada vez software de más calidad. Espero nos tengais en cuenta si necesitais algún tipo de consultaría o formación a medida.

Al margen de este tutorial, os invito a que profundizeis en esta importante
filosofía de desarrollo de sistemas pues como dije antes, esto no es más que un tutorial y no un libro concreto y/o especializado en programación orientada a aspectos, Spring, etc.

Carlos García Pérez. Creador de MobileTest, un complemento educativo para los profesores y sus alumnos.

cgpcosmad@gmail.com


2 Comentarios

  1. Descubrimos q al utilizar Interfaces no funciona!
    lo resolvimos asi!! Saludos!

    @SuppressWarnings(\\\»unchecked\\\»)
    private Method getCallMethod(org.aspectj.lang.ProceedingJoinPoint call){
    Method metodo = null;

    try {
    Signature sig = call.getSignature();
    Class clase = sig.getDeclaringType();
    String methodName = sig.getName();
    Object[] args = call.getArgs();
    Class[] params = new Class[args.length];

    for (int i = 0, count = args.length; i < count; i++){
    params[i] = args[i].getClass();
    }

    metodo = clase.getMethod(methodName, params);

    if (metodo.getDeclaringClass().isInterface()) {
    metodo = call.getTarget().getClass().getDeclaredMethod(methodName, metodo.getParameterTypes());
    }

    } catch (Exception e) {
    // Ignoramos: SecurityException, NoSuchMethodException
    }

    return metodo;
    }

  2. Si no usais xml para la definición del aspecto (como en en este tutorial) teneis que ANOTAR el aspecto con @Component sino no funcionará.

    static.springsource.org/spring/docs/3.1.0.M2/spring-framework-reference/html/aop.html#aop-at-aspectj

Dejar respuesta

Please enter your comment!
Please enter your name here