📜  Spring AOP – AspectJ 注解

📅  最后修改于: 2022-05-13 01:54:31.572000             🧑  作者: Mango

Spring AOP – AspectJ 注解

AOP 即面向方面的编程通过启用横切关注点的模块化来补充 OOP。 @AspectJ 主要用于将切面声明为带有注解的常规Java类。 Spring AspectJ AOP 实现有很多注解。它们解释如下:

  • @Aspect :它将类声明为方面。
  • @Pointcut :它声明了切入点表达式。

用于创建建议的常见 AspectJ 注释如下:

  • @Before :它在方法执行之前运行。
  • @AfterReturning :在方法返回结果后运行。
  • @AfterThrowing :在方法抛出异常后运行。
  • @After(Finally) :在方法执行后或抛出异常或方法返回结果后执行。
  • @Around :可以执行方法调用前后的行为。
  • @Pointcut :Pointcut 是与连接点匹配的签名。

@Pointcut

带有 before 通知的切入点表达式示例如下:

Java
// Annotation
@Before("execution(* abc.def.gettingstarted.dao.*.add(..))")
public void allMethods(Point Point)
{
  // Aspect body 
}


Java
@Aspect
public class Logging {
  
   @PointCut("execution(* com.gfg.Student.getName(..))")
   private void selectGetName(){}
    
   @Before("selectGetName()")
   public void beforeAdvice(){
      System.out.println("Going to setup student profile.");
   }  
    
}


Java
@Slf4j
@Aspect
@Component
public class LoggingAspect {
    
    @AfterReturning("execution(* com.gfg.spring.aop.service.FileSystemStorageService.readFile(..))")
    public void methodCall(JoinPoint jp, Exception ex) {
        log.error("Target method is successfully completed!!");
    }
    
}


Java
@AfterThrowing(PointCut = "execution(* com.gfg.Student.*(..))", throwing = "error")
public void throwingAdvice(JoinPoint jp, Throwable error){
   System.out.println("Method Signature: "  + jp.getSignature());  
   System.out.println("Exception: "+error);  
}


Java
@After("execution(* com.gfg.saop.after.dao.*.*(..))")
public void logResult(JoinPoint joinPoint)
{
    System.out.println(
        "After advice executed: "
        + joinPoint.getSignature().toShortString());
}


@Before(建议之前)

在执行目标方法之前运行通知。 Before 通知可以访问 Target 方法的所有参数。它不能改变原始方法的参数值。在通知之前必须指定一个切入点表达式,除非我们使用单独的 @Pointcut 表达式提供程序。

示例:在执行 selectGetName() 方法之前执行之前注释的 beforeAdvice() 方法

Java

@Aspect
public class Logging {
  
   @PointCut("execution(* com.gfg.Student.getName(..))")
   private void selectGetName(){}
    
   @Before("selectGetName()")
   public void beforeAdvice(){
      System.out.println("Going to setup student profile.");
   }  
    
}

@AfterReturning(返回通知后)

返回通知是一个普通的Java方法,只是我们必须添加@AfterReturning注解和一个Pointcut表达式。 Pointcut 表达式映射到目标方法的签名、类和包,并且通知应用于所有此类匹配方法。

示例:在下面的示例中,方法调用方法在 readFile 方法返回某些内容时执行。

Java

@Slf4j
@Aspect
@Component
public class LoggingAspect {
    
    @AfterReturning("execution(* com.gfg.spring.aop.service.FileSystemStorageService.readFile(..))")
    public void methodCall(JoinPoint jp, Exception ex) {
        log.error("Target method is successfully completed!!");
    }
    
}

@AfterThrowing(投掷后建议)

顾名思义,AfterThrowing 通知在目标方法抛出异常时执行。如果方法成功完成,或者方法吞下抛出的异常,它将不会运行。因此,AfterThrowing 建议很有用,当我们想要构建一个通用异常处理程序时,可以捕获由不同目标方法抛出的不同异常并采取行动。

示例:在下面的示例中,当 Student 类的任何方法抛出异常时,将执行 throwingAdvice 方法。

Java

@AfterThrowing(PointCut = "execution(* com.gfg.Student.*(..))", throwing = "error")
public void throwingAdvice(JoinPoint jp, Throwable error){
   System.out.println("Method Signature: "  + jp.getSignature());  
   System.out.println("Exception: "+error);  
}

@After(之后/最后的建议)

After 通知在目标方法完成后运行,或者在目标方法导致异常时包含在内。这个建议类似于Java中的 final 块,无论结果如何,它总是执行。

示例:在方法执行后或抛出异常或方法返回结果后执行通知后。

Java

@After("execution(* com.gfg.saop.after.dao.*.*(..))")
public void logResult(JoinPoint joinPoint)
{
    System.out.println(
        "After advice executed: "
        + joinPoint.getSignature().toShortString());
}

@Around(周围建议)

Spring AOP 支持各种类型的建议,而环绕建议就是其中一种建议。此建议围绕目标方法执行。这意味着,在目标方法执行时,围绕通知运行并调用目标方法。因此,建议可以完全控制在方法执行之前和之后应用附加代码。由于它的灵活性,Around 建议非常受欢迎。但是,Spring 建议我们应该根据需求使用最具体的通知类型。它执行的行为与合并之前和之后的建议相同。