Spring AOP 切面编程学习笔记

package com.ltgsas.spring.aop.annotation;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import java.util.Arrays;

1.在切面中,需要通过指定的注解将方法标识为通知方法
@Before:前置通知,在目标对象方法执行之前执行
@After:后置通知,在目标对象方法执行之后执行
2.切入点表达式:设置在标识通知的注解的 value 属性中
限定某个方法: "execution(public int com.ltgsas.spring.aop.annotation.CalculatorImpl.add(int,int))"
适用所有方法: "execution(* com.ltgsas.spring.aop.annotation.CalculatorImpl.*(..))"

  • 第1个 * 表示任意的访问修饰符和返回值类型
  • 第2个 * 表示类中任意的方法
  • .. 表示任意的参数列表

类的地方也可以使用 *,表示包下所有的类

3.重用切入点表达式

 @Pointcut("execution(* com.ltgsas.spring.aop.annotation.CalculatorImpl.*(..))")
 public void pointCut() {}

4.获取连接点的信息
在通知方法的参数位置,设置 JoinPoint 类型的参数,就可以获取连接点所对应方法的信息
// 获取连接点所对应方法的签名信息

Signature signature = joinPoint.getSignature();

// 获取连接点所对应方法的参数

 Object[] args = joinPoint.getArgs();

LoggerAspect 类主体:

@Component
@Aspect // 将当前组件标识为切面
public class LoggerAspect {
    @Pointcut("execution(* com.ltgsas.spring.aop.annotation.CalculatorImpl.*(..))")
    public void pointCut() {}
    // @Before("execution(public int com.ltgsas.spring.aop.annotation.CalculatorImpl.add(int,int))")
    // @Before("execution(* com.ltgsas.spring.aop.annotation.CalculatorImpl.*(..))")
    @Before("pointCut()")
    public void beforeAdviceMethod(JoinPoint joinPoint) {
        // 获取连接点所对应方法的签名信息
        Signature signature = joinPoint.getSignature();
        Object[] args = joinPoint.getArgs();
        System.out.println("LoggerAspect: 前置通知->准备运算方法:"+signature.getName()+"(), 参数:"+ Arrays.toString(args));
    }
    @After("pointCut()")
    public void afterAdviceMethod(JoinPoint joinPoint) {
        // 获取连接点所对应方法的签名信息
        Signature signature = joinPoint.getSignature();
        System.out.println("LoggerAspect: 后置通知->"+signature.getName()+"() 运算完毕!");
    }
    /**
     * 在返回通知中若要获取目标对象方法的返回值,
     * 只需要通过 @AfterReturning 注解的 returning 属性,
     * 就可以将通知方法的某个参数指定为接收目标对象方法的返回值的参数
     */

    @AfterReturning(value = "pointCut()",returning = "result")
    public void afterReturningAdviceMethod(JoinPoint joinPoint,Object result) {
        // 获取连接点所对应方法的签名信息
        Signature signature = joinPoint.getSignature();
        System.out.println("LoggerAspect, 返回通知!"+signature.getName()+"() 结果:"+result);
    }

    /**
     * 在异常通知中若要获取目标对象方法的异常
     * 只需要通过 AfterThrowing 注解的 throwing 属性
     * 就可以将通知方法的某个参数指定为接收目标对象方法的返回值的参数
     */
    @AfterThrowing(value = "pointCut()",throwing = "exception")
    public void afterThrowingAdviceMethod(JoinPoint joinPoint,Exception exception) {
        Signature signature = joinPoint.getSignature();
        System.out.println("LoggerAspect, 返回通知!"+signature.getName()+"() 异常:"+exception);
    }
    }

相应的 XML 文件:


<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context 
        https://www.springframework.org/schema/context/spring-context.xsd 
        http://www.springframework.org/schema/aop 
        https://www.springframework.org/schema/aop/spring-aop.xsd">
    
    <context:component-scan base-package="com.ltgsas.spring.aop.annotation"/>
    
    <aop:aspectj-autoproxy/>
beans>

执行效果
Spring AOP 切面编程学习笔记_第1张图片

你可能感兴趣的:(自学笔记,spring,学习,java)