Spring注解(十二) AOP功能测试

607 阅读2分钟

概念

  1. 连接点
    • 可以被增强的方法
  2. 切入点
    • 实际被增强的方法
  3. 通知(增强)
    • 实际增强的部分, 比如加的日志
  4. 切面 (是动作)
    • 把通知应用到切入点过程

通知类型

  • 前置通知@Before
  • 后置通知@After 方法执行之后(有没有异常都执行)
  • 环绕通知@Around 方法之前之后都有, 方法里有参数(ProceedJoinpoint 表示要增强的方法)
  • 异常通知@AfterThrowing 异常才执行
  • 最终通知@AfterReturning 返回值之后执行(有异常不执行了)

步骤

要求:

  • 有一个普通类, 有一个切面类(带@Aspect注解),都要加入容器中
  • 开启切面功能@EnableAspectJAutoProxy 普通类
@Controller
@ComponentScan("com.alex.aop1")
@EnableAspectJAutoProxy // 开启切面功能
public class MathCalculator {

    public int div(int i, int j) {
        return i/j;
    }
}

切面类

@Aspect
@Controller
public class LogAspects {
	// 切入点表达式写法
    @Pointcut("execution(public * com.alex.aop1.MathCalculator.*(..))")
    private void pointCut() {}

    // @Before切入
    @Before("pointCut()")//切入点表达式
    public void logStart() {
        System.out.println("除法运行...参数运行列表时: {}");
    }
    @After("pointCut()")
    public void logEnd() {
        System.out.println("除法...结束: ");
    }
    @AfterReturning("pointCut()")
    public void logReturn() {
        System.out.println("除法...返回: {}");
    }
    @AfterThrowing("pointCut()")
    public void logException() {
        System.out.println("除法...异常: {}");
    }
}

解释: pointCut方法, 抽取出来的切入点表达式, 可以在不同的通知处使用.

返回值/异常/方法信息

  • 打印参数名 和 参数值 如果希望获取到函数的参数, 签名等, 就需要代入JoinPoint joinPoint作为方法参数
// @Before切入
@Before("pointCut()")//切入点表达式
public void logStart(JoinPoint joinPoint) {
    System.out.println("除法运行..."+ "函数名: " + joinPoint.getSignature().getName()+"参数运行列表时: {"+ Arrays.toString(joinPoint.getArgs())+"}");
}
  • 打印返回值 步骤:
  1. returning = "result" 设定一个变量名result
  2. Object result 方法签名传入result
  3. 方法体里就可以拿到返回值了
  @AfterReturning(value = "pointCut()", returning = "result")
    public void logReturn(Object result) {
        System.out.println("除法...返回: {"+ result +"}");
    }
  • 异常 同上.
    @AfterThrowing(value ="pointCut()", throwing = "e")
    public void logException(Exception e) {
        System.out.println("除法...异常: {"+ e +"}");
    }