Spring interceptor no puede interceptar llamadas a métodos dentro de la clase

Cuando se usa el marco de resorte, el interceptor de resorte es la característica más utilizada. En general, usamos anotaciones para usar la intercepción, como la anotación de transacción @Transactional. Pero para las llamadas a métodos dentro de la clase, el interceptor no es válido.

Ejemplos específicos son los siguientes:

package com.juying.test

public class TestAop {
    public void test1() {
        test2();
        test3();
    }

    public void test2() {
        System.out.println("test2");
    }

    public void test3() {
        System.out.println("test3");
    }
}

Interceptor

@Aspect
public class TheAspect {
    @Before("execution(* com.juying.test.TestAop.*(..))")  
    public void checkData() {
        System.out.println("checkData");
    }
}

Cuando se ejecuta el método test1 en la clase TestAop, checkData se generará solo una vez.

Motivo: El interceptor se realiza mediante proxy dinámico. El proxy dinámico es generar una nueva clase de proxy. Toda la información ha cambiado (nombre de clase, nombre de paquete), por lo que no puede ser interceptada.

public class TestAopXxxxx+地址 {
    public void test1() {
        test2();
        test3();
    }

    public void test2() {
        System.out.println("test2");
    }

    public void test3() {
        System.out.println("test3");
    }
}

Soluciones:
1. Migre los métodos que deben ser interceptados a otras clases
2. Llame a través de la inyección @Autowired en lugar de usar esto

190 artículos originales publicados · 19 alabanzas · 200,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/zengchenacmer/article/details/78207559
Recomendado
Clasificación