aprendizaje de primavera (tres) -AOP

1. Anotación

  1. @EnableAspectJAutoProxy : Habilita la función de proxy springAOP
  2. @Aspect : identifica la clase actual como un aspecto para que el contenedor lea
  3. @Pointcut : declara el punto de entrada global, el método declarado es solo el portador de la anotación, el punto de entrada específico solo necesita ser introducido en el portador
  4. @Before : notificación previa
  5. @AfterReturning: Publicar notificación
  6. @Around: Notificación envolvente significa: notificación frontal + notificación trasera
  7. @Después: Aviso final
  8. @AfterThrowing: notificación de excepción

En segundo lugar, realice la función AOP

  • Importar el paquete jar
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.2</version>
</dependency>         
  • Continúe con la demostración de prueba anterior y cree test2

  • Crear interfaz
package com.test.spring.test3;

public interface TestAop {

    void testAop1();
}
  • Cree una clase de implementación y regístrela como Bean
package com.test.spring.test3;

import org.springframework.stereotype.Component;

@Component
public class TestAopImpl implements TestAop {

    @Override
    public void testAop1() {
        System.out.println("TestAopImpl.testAop1()");
    }
}
  • Crear aspecto
package com.test.spring.test3.aop;

import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * 需要将定义的切面类注册到springIOC容器中,否则spring无法实现aop功能(因为spring没有切面类的           实例)  
 */
@Aspect
@Component
public class FirstTangent {

    @Pointcut("execution(public * com.test.spring.test3.TestAopImpl.testAop1(..))")
    public void url(){}

    /**
     *  前置通知
     */
    @Before("url()")
    public void testBefore(){
        System.out.println("testBefore");
    }
    /**
     *  后置通知
     */
    @AfterReturning("url()")
    public void testAfterReturning(){
        System.out.println("testAfterReturning");
    }
    
 }
  • Crear configuración
package com.test.spring.test3;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;


/**
 * @EnableAspectJAutoProxy     ---  开启springAOP代理功能
 */
@ComponentScan
@Configuration
@EnableAspectJAutoProxy
public class AopConfig {

}
  • Escribe el código de prueba
package com.test.spring.test3;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AopConfig.class)
public class Test3 {

    @Autowired
    private TestAop testAop;

    @Test
    public void TestAop(){
        testAop.testAop1();
    }
}
  • Resultados de la prueba

3. Acerca de la notificación envolvente

El parámetro ProceedingJoinPoint es necesario para escribir la notificación envolvente. Después de ejecutar la notificación actual, utilice el método de proceder para liberar. Cuando se ejecute el método de destino, volverá a este método de notificación y continuará ejecutando la notificación posterior.

  • Modifique la clase FirstTangent para agregar un método de notificación envolvente
@Aspect
@Component
public class FirstTangent {

    @Pointcut("execution(public * com.test.spring.test3.TestAopImpl.testAop1(..))")
    public void url(){}

    /**
     *  前置通知
     */
    //@Before("url()")
    public void testBefore(){
        System.out.println("testBefore");
    }

    //@AfterReturning("url()")
    public void testAfterReturning(){
        System.out.println("testAfterReturning");
    }

    //@AfterThrowing("url()")
    public void testAfterThrowing(){
        System.out.println("testAfterThrowing");
    }

    @Around("url()")
    public void testAround(ProceedingJoinPoint pjp){
        //----------前置-----------
        System.out.println("testAround1");
        
        //----------执行目标方法-----------
        try {
            pjp.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        //-------------后置-----------------
        System.out.println("testAround2");
    }
}
  • Prueba de notificación envolvente

Cuarto, use AOP para interceptar anotaciones

Simplemente modifique el punto de entrada global:

      如 : @Pointcut ("@ anotación (com.test.spring.multi_data_source.annotation.DataSource)")

      Jaja, ¿es mucho más conveniente usar anotaciones personalizadas?

Supongo que te gusta

Origin blog.csdn.net/qq_42407917/article/details/95619407
Recomendado
Clasificación