Use Aspect para implementar rápidamente una anotación personalizada

Recientemente escribí algo y pensé que sería mejor poner el ejemplo primero.

código frontal

enfocar:

  1. Uso de clase de aspecto @Configuration, @Aspectanotación
  2. El método principal de la clase de aspecto usa @Before, @After, @AfterReturning, @AfterThrowing, @Aroundetc. para hacer el corte
  3. La clase utilizada debe inyectarse mediante el método @Resource para que surta efecto.
@Aspect
@Configuration  
public class PrintBeforeMethodAspect {  
    @Around("@annotation(PrintBeforeMethod)")  
    public void printBefore(ProceedingJoinPoint joinPoint) throws Throwable {  
        System.out.println("before method");  
        joinPoint.proceed();  
        System.out.println("after method");  
    }  
}
复制代码
@Resource  
Test testService;

@RequestMapping("/aspect/test")  
public Object aspectTest() {  
    testService.test();  
    return "执行完毕";  
}
复制代码

origen

Recientemente, existe la necesidad de agregar la función multiusuario al sistema, es necesario usar la programación de aspectos, usar @Aspect, compartirlo

Introducción a @Aspect

La anotación @Aspect se usa para marcar una clase como una clase de aspecto. Las clases de aspectos son una parte importante de AOP (Programación Orientada a Aspectos).

La anotación @Aspect le dice al marco Spring que esta clase contiene lógica de aspecto y requiere procesamiento AOP. En la clase anotada, el método de aspecto se puede definir para implementar la intercepción y mejora de otros métodos.

Los métodos de corte comúnmente utilizados son:

  1. @Before: el método ejecutado antes de la ejecución del método de destino es una mejora previa.
  2. @After: el método ejecutado después de la ejecución del método de destino pertenece a la mejora posterior.
  3. @AfterReturning: un método que se ejecuta después de que el método de destino se completa normalmente, es una mejora de retorno.
  4. @AfterThrowing: un método ejecutado después de que se produzca una excepción en el método de destino, que pertenece a la mejora de excepciones.
  5. @Around: puede ejecutar métodos personalizados antes y después del método de destino para lograr una mejora de la trama. Puede haber un parámetro JoinPoint, que se utiliza para obtener información como la firma del método del punto de tejido.

El uso de la anotación @Aspect le permite a AOP realizar operaciones como control de autoridad, monitoreo de desempeño y procesamiento de transacciones para cada método en la capa comercial, mejorando así la jerarquía y la solidez del sistema.

Ejemplo de implementación completa

Lo uso con anotaciones.

anotación personalizada

package com.kevinq.aspect;  
  
import java.lang.annotation.*;  
  
/**  
 * @author qww  
 * 2023/4/15 11:24 */
@Target({ElementType.METHOD})  
@Retention(RetentionPolicy.RUNTIME)  
@Inherited  
public @interface PrintBeforeMethod {  
  
  
}
复制代码

Aspect, el programa principal: (tenga en cuenta que la anotación @Configuration está en la clase de aspecto)

package com.kevinq.aspect;  
  
//import org.aspectj.lang.ProceedingJoinPoint;  
import org.aspectj.lang.ProceedingJoinPoint;  
import org.aspectj.lang.annotation.Around;  
import org.aspectj.lang.annotation.Aspect;  
import org.aspectj.lang.annotation.Before;  
import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;  
import org.springframework.stereotype.Component;  
  
/**  
 * @author qww  
 * 2023/4/15 11:27 */
@Aspect  
@Configuration  
public class PrintBeforeMethodAspect {  
  
    @Around("@annotation(PrintBeforeMethod)")  
    public void printBefore(ProceedingJoinPoint joinPoint) throws Throwable {  
        System.out.println("before method");  
        joinPoint.proceed();  
        System.out.println("after method");  
    }  
  
}
复制代码

Método de llamada:

añadir la nota

@Service  
public class TestService implements Test{  
  
    @Override  
    @PrintBeforeMethod    
    public void test() {  
        System.out.println("执行test方法");  
    }  
}
复制代码

método de llamada

@Resource  
Test testService;

@RequestMapping("/aspect/test")  
public Object aspectTest() {  
    testService.test();  
    return "执行完毕";  
}
复制代码

Vale la pena señalar que debido a que @Configuration se usa para inyectar, es necesario usar @Resource para instanciar la llamada, y no es válido usar el nuevo TestService().

Supongo que te gusta

Origin juejin.im/post/7222152731946139707
Recomendado
Clasificación