Explicación detallada de la clase JoinPoint y la clase Proceedingjoinpoint de SpringAOP y la notificación envolvente de AOP para obtener información de anotaciones

1. Clase JoinPoint, clase Proceedingjoinpoint

1. Cuando se usa springboot para escribir AOP, se usa una clase JoinPoint para obtener información sobre la clase de proxy y la clase de proxy.

JointPoint es un punto identificable durante la ejecución del programa. Este punto se puede utilizar como punto de entrada AOP. El objeto JointPoint contiene mucha información relacionada con el corte. Como objetos de punto de entrada, métodos, propiedades, etc. Podemos obtener el estado y la información de estos puntos a través de la reflexión, que se utiliza para rastrear y registrar la información de la aplicación de registro.

# 返回目标对象,即被代理的对象
Object getTarget();

# 返回切入点的参数
Object[] getArgs();

# 返回切入点的Signature
Signature getSignature();

# 返回切入的类型,比如method-call,field-get等等,感觉不重要 
 String getKind();

2. El punto de unión en curso hereda JoinPoint. El método de proceder se expone en función de JoinPoint.

Notificación envolvente = ejecución previa + del método de destino + notificación posterior . El método de proceder se utiliza para iniciar la ejecución del método de destino. Exponer este método puede respaldar aspectos como aop:around.

( Proceedingjoinpoint solo admite la notificación envolvente @Around, mientras que otros aspectos solo necesitan usar JoinPoint. Esta es también la mayor diferencia entre la notificación envolvente y los métodos de notificación previa y posterior. Esto está relacionado con el tipo de aspecto )

Nota:
joinpoint.getSignature(): obtiene información sobre el método mejorado.
Después de que el objeto obtenido por joinpoint.getSignature se convierte por la fuerza en la clase de implementación MethodSignature, el método getReturnType () interno se puede usar para obtener el tipo de valor de retorno del método de destino.

@Before("customerJoinPointerExpression()")
public void beforeMethod(JoinPoint joinPoint){
    // 前置通知
	joinPoint.getSignature().getName(); // 获取目标方法名
	joinPoint.getSignature().getDeclaringType().getSimpleName(); // 获取目标方法所属类的简单类名
	joinPoint.getSignature().getDeclaringTypeName(); // 获取目标方法所属类的类名
	joinPoint.getSignature().getModifiers(); // 获取目标方法声明类型(public、private、protected)
	Object[] args = joinPoint.getArgs(); // 获取传入目标方法的参数,返回一个数组
	joinPoint.getTarget(); // 获取被代理的对象
	joinPoint.getThis(); // 获取代理对象自己
}
  // 匹配方法执行连接点方式
    @Around(value = "execution(* *..SomeserviceImpl.Dofirst(..))")
    public Object myAspectJ(ProceedingJoinPoint point) throws Throwable {
      
         //拦截的实体类
        Object target = point.getTarget();
        //拦截的方法名称
        String methodName = point.getSignature().getName();
        //拦截的方法参数
        Object[] args = point.getArgs();
        //拦截的放参数类型
        Class[] parameterTypes = ((MethodSignature)point.getSignature()).getMethod().getParameterTypes();

        object = point.proceed(); //目标方法的执行
        return null;
    }

2. Notificación envolvente AOP para obtener información de anotaciones

1. Concepto

La anotación es información escrita en el código fuente. Puede proporcionar información adicional más allá del código. Tiene su propia estructura. Puede utilizar herramientas para extraer esta información estructurada.
En pocas palabras, las anotaciones son comentarios estructurados escritos encima del programa. Java leerá el mensaje de acuerdo con su estructura y realizará las operaciones correspondientes.
Por ejemplo, si la anotación @Override está marcada en un método, durante la compilación, Java verificará si el método actual sobrecarga el método de la clase principal y, de lo contrario, se informará un error.

Java viene con anotaciones estándar
@Override: indica que la definición del método actual anulará el método en la clase principal;
@Deprecated: indica que el código está en desuso y el compilador emitirá una advertencia si se utiliza el código anotado con @Deprecated;
@ SuppressWarnings: indica Desactivar los mensajes de advertencia del compilador.

Utilice las anotaciones anteriores para generar sus propias anotaciones. Al igual que si define una clase usted mismo, puede crear una anotación personalizada a través de @interface.

[@Target]     //限定注解可以标注的位置:ANNOTATION_TYPE、CONSTRUCTOR 、FIELD 、LOCAL_VARIABLE 、METHOD 、PACKAGE 、PARAMETER 、TYPE
[@Retention]  //说明了这个注解的存活时间	:SOURCE,CLASS ,RUNTIME
[@Documented] // 将注解中的元素包含到 Javadoc 中去	
[@Inherited]  //子类自动拥有父类的注解	
public @interface [名称] {
     // 元素
     String value() default "hello";
}

[@Retention]
RetentionPolicy.SOURCE: la anotación solo se conserva en la etapa del código fuente y se descartará e ignorará cuando el compilador compile;
RetentionPolicy.CLASS: la anotación solo se conserva hasta que la compilación esté en progreso y no cargarse en la JVM.;
RetentionPolicy.RUNTIME: las anotaciones se pueden conservar hasta que el programa se esté ejecutando y se cargarán en la JVM, de modo que las anotaciones se puedan obtener cuando el programa se esté ejecutando .

2. Ejemplos de código

anotación:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AopCache 
{
    /**
     * 每个方法唯一的key
     */
    String key();
}

Tipo de sección:

@Aspect    //标注增强处理类(切面类)
@Component //交由Spring容器管理
@Order(0)  //设置优先级,值越低优先级越高
public class MyaspectJ {

    //定义增强,pointcut连接点使用@annotation(xxx)进行定义
    @Pointcut(value = "@annotation(xx.xx.xx.AopCache)")
    public void methodPointcut(){}

    // 匹配方法执行连接点方式
    @Around("methodPointcut()")
    public Object myAspectJ(ProceedingJoinPoint point) throws Throwable {
    
        // 获取方法上的注解
        MethodSignature methodSignature = (MethodSignature) point.getSignature();
        Method method = methodSignature.getMethod();
        AopCache annotation = method.getAnnotation(AopCache.class);
        //获取key
        String key = annotation.key();

        object = point.proceed();   // 1. 目标方法的调用
        return null;
    }
}

Si el método utiliza esta anotación, realizará directamente una mejora de aspecto.

@AopCache(key = "自定义key值")
public String getAllType(){

   return "";
}

Supongo que te gusta

Origin blog.csdn.net/Little_Arya/article/details/129973814
Recomendado
Clasificación