Spring AOP切面


OOP思想存在的问题

概念和理解

AOP (Aspect Oriented Programming) ,意为:面向切面编程,可以通过预编译方式和运行期

动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。

AOP的编程思想就是把很多类对象中的横切问题点,从业务逻辑中分离出来,从而达到解耦的目的,

增加代码的重用性,提高开发效率。

Spring实现拦截的几种方式

1、使用@Aspect 注解

2、自定义aop类,实现MethodInterceptor接口

3、拦截器,实现HandlerInterceptor接口

Aop切面注解解析

execution表达式

基本语法格式为:execution(<修饰符模式>?<返回类型模式><方法名模式>(<参数模式>)<异常模式>?)除了返回类型模式,方法名模式和参数模式外,其它项都是可选的。

@Pointcut("execution(public * cn.iot.*.controller..*.*(..))")

public void logCut(){

}

@Around("logCut()")

public Object validateParam(ProceedingJoinPoint joinPoint) throws Throwable {

System.out.println("进入切面进行验证");

Object obj = joinPoint.proceed();

return obj;

}

*:匹配任何数量字符;

..:匹配任何数量字符的重复,如在类型模式中匹配任何数量子包;而在方法参数模式中匹配任何数量参数。

+:匹配指定类型的子类型;仅能作为后缀放在类型模式后边。

@args

args主要是用来限制方法的参数的,args有两种表现形式:@args 和args
使用@args需要通过注解,如果方法里面有参数持有这个注解,就可以。

@annotation

Aspect概念(切面)

常用注解:

  1. Before 某方法调用之前发出通知。
  2. After 某方法完成之后发出通知,不考虑方法运行的结果。
  3. After-returning 将通知放置在被通知的方法成功执行之后。
  4. After-throwing 将通知放置在被通知的方法抛出异常之后。
  5. Around 通知包裹在被通知的方法的周围,在方法调用之前和之后发出通知。

连接点(Joinpoint)

增强程序执行的某个特定位置(要在哪个地方做增强操作)。SPring仅支持方法的连接点,既仅能在方法调用前,方法调用后,方法抛出异常时等这些程序执行点进行织入增强。

切点(Pointcut)

切点是一组连接点的集合。AOP通过”切点”定位特定的连接点。通过数据库查询的概念来理解切点和连接点的关系再适合不过来:连接点相当于数据库中的记录,而切点相当于查询条件。

增强(Advice)

增强是织入到目标类连接点上的一段程序代码。表示要在连接点上做的操作。

切面(Aspect)

切面由切点和增强(引介)组成(可以包含多个切点和多个增强),它既包括横切逻辑的定义,也包括连接点的定义,SpringAOP就是负责实施切面的框架,它将切面所定义的横切逻辑织入到切面所指定的链接点中。

SpringAOP常用注解如下:

@aspect(定义切面)

@pointcut(定义切点)


@before(标注Before Advice定义所在的方法)

@afterreturning(标注After Returning Advice定义所在的方法)

@afterthrowing(标注After Throwing Advice定义所在的方法)

@after(标注After(Finally)Advice定义所在的方法)

@around(标注Around Advice定义所在的方法)

应用场景

从实际开发出发,举两个典型例子简单概括一下:


(1)可用于做接口权限控制或者是权限控制;

(2)可用于检测接口请求并统计接口请求次数;

实际上可以从这么几个方面深入挖掘?

(1)日志记录;


(2)性能统计;


(3)安全控制(可以理解为权限控制);

(4)事务处理;

(5)异常处理;

切面如何使用

实现一个切面类:

1.定义要给日志切面类Aspect

2.定义切点Pointcut

3.定义Advice通知

4.controller 接口

依赖:

org.springframework.boot

spring-boot-starter-aop

切面可以统一处理业务能力 。

切面拦截controller类,

controller 是接口,一个接口代表的是用户的接口;做食物的时候,做的是用户的接口,我们保证一次请求是一个事务,而不是service,一个controller可能对应的是多个service,怎么做对应呢,做几个事务呢