一、aop底层原理
底层原理:动态代理--jdk动态代理或cglib动态代理,其中jdk代理为spring默认使用(参考:设计模式--04--结构型--01--代理模式)
spring中切换jdk代理与cglib代理:
1、默认使用jdk代理
2、切换为cglib代理的3种方式
- xml配置中切换方式 <aop:config proxy-target-class="true"> </aop>
- 注解切换方式 <aop:aspectj-autoproxy proxy-target-class="true" />
- 配置类切换方式 @EnableAspectJAutoProxy(proxyTargetClass = true)
3、当jdk代理不可用时,仍自动切换为使用cglib代理
二、AOP术语
- 连接点:类里面的哪些方法可以被增强
- 切入点:实际被真正增强的方法
- 通知(增强):增强的逻辑部分
- 切面:把通知应用到切入点,是动作
通知类型:
- 前置通知:切入点执行前的增强
- 后置通知:方法正常执行、异常执行都会执行,类似finally(最终通知)
- 环绕通知:目标方法执行前后都执行,包括异常时
- 异常通知:切入点有异常的增强
- 返回通知:方法返回后进行的增强--方法正常执行会执行,异常执行不会执行
三、AspectJ
3.1 Spring框架一般都是基于AspectJ实现AOP操作
AspectJ不是Spring组成部分,独立AOP框架,一般把AspectJ和Spirng框架一起使用,进行AOP操作
3.2 基于AspectJ实现AOP的操作方式
(1)基于xml配置文件实现
或者
(2)基于注解方式实现(常用)
备注--spring实现aop需要映入的依赖(maven项目):
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>5.2.6.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>5.2.6.RELEASE</version> </dependency>
四、切入点表达式
(1)切入点表达式作用:知道对哪个类里面的哪个方法进行增强
(2)语法结构:execution(权限修饰符 [返回类型] 类全路径 方法名称(参数列表) ),其中返回值类型可以不写
常见的切入点表达式举例:
举例1:对com.atguigu.dao.BookDao类里面的add进行增强execution(* com.atguigu.dao.BookDao.add(..))
举例2:对com.atguigu.dao.BookDao类里面的所有的方法进行增强execution(* com.atguigu.dao.BookDao.*(..))
举例3:对com.atguigu.dao包里面所有类,类里面所有方法进行增强execution(* com.atguigu.dao.*.*(..))