Explicación simple para alguien que es nuevo en los conceptos AOP. Esto no es exhaustivo, pero debería ayudar a comprender los conceptos. Si ya está familiarizado con la jerga básica, puede dejar de leer ahora.
Suponga que tiene una clase Empleado normal y desea hacer algo cada vez que se llaman a estos métodos.
class Employee{
public String getName(int id){....}
private int getID(String name){...}
}
estos métodos se denominan JoinPoints . Necesitamos una forma de identificar estos métodos para que el marco pueda encontrar los métodos, entre todas las clases. Métodos que ha cargado. Entonces escribiremos una expresión regular para que coincida con la firma de estos métodos. Si bien hay más, como verá a continuación, pero vagamente esta expresión regular es lo que define Pointcut . p.ej
* * mypackage.Employee.get*(*)
Primero * es para el modificador público / privado / protegido / predeterminado. El segundo * es para el tipo de retorno del método.
Pero luego también necesitas decir dos cosas más:
- ¿Cuándo se debe realizar una acción? Por ejemplo, antes / después de la ejecución del método O en caso de excepción
- ¿Qué debería hacer cuando coincide (tal vez solo imprima un mensaje)
La combinación de estos dos se llama Consejo .
Como puede imaginar, tendría que escribir una función para poder hacer # 2. Entonces, así es como podría verse para lo básico.
Nota: Para mayor claridad, use la palabra REGEX en lugar de * * mypackage.Employee.get*(*)
. En realidad, la expresión completa entra en la definición.
@Before("execution(REGEX)")
public void doBeforeLogging() {....} <-- executed before the matching-method is called
@After("execution(REGEX)")
public void doAfterLogging() {....} <-- executed after the matching-method is called
Una vez que comiences a usarlos bastante, podrías terminar especificando muchos consejos @ After / @ Before / @ Around. Las expresiones regulares repetidas eventualmente terminarán haciendo las cosas confusas y difíciles de mantener. Entonces, lo que hacemos, simplemente le damos un nombre a la expresión y la usamos en cualquier otro lugar de la clase Aspect.
@Pointcut("execution(REGEX)") <-- Note the introduction of Pointcut keyword
public void allGetterLogging(){} <-- This is usually empty
@Before("allGetterLogging")
public void doBeforeLogging() {....}
@After("allGetterLogging")
public void doAfterLogging() {....}
Por cierto, también querrás envolver toda esta lógica en una clase, que se llama Aspecto y escribirías una clase:
@Aspect
public class MyAwesomeAspect{....}
Para que todas estas cosas funcionen, tendría que decirle a Spring que analice las clases para leer, comprender y tomar medidas sobre las palabras clave @ AOP. Una forma de hacerlo es especificando lo siguiente en el archivo xml de configuración de primavera:
<aop:aspectj-autoproxy>