03 Spring AOP
2022-11-21 00:51:19 1 举报
03 Spring AOP
作者其他创作
大纲/内容
AOP 介绍
AOP 与 OOP
OOP:Object Oriented Programming 面向对象编程
面向的对象主要是类
AOP:Aspect Oriented Programming 面向切面编程
基于OOP基础之上新的编程思想
面向的对象主要是切面
是Spring中重要的核心点
虽然IOC容器没有依赖AOP,AOP用来对IOC做补充
应用场景:
处理日志
安全管理
事务管理
...
AOP 概念
它是一种面向切面编程编程思想
它可以干啥嘞:
在不修改原有代码情况下
去增强跟主要业务没有关系的公共功能代码到之前写好方法中的指定位置
这种编程思想就是AOP
AOP 的底层是通过代理实现的,代理是一种设计模式
静态代理
需要为每一个被代理的类创建一个“代理类”
弱点:这种方式可以实现AOP效果,但成本太高
动态代理(AOP的底层是用的动态)
JDK动态代理
它是基于反射完成的
代码示例:使用jdk动态代理完成增加日志功能
1、ClassLoader loader 类加载器 ,通常指定的被代理类的接口的类加载器
2、Class<?>[] interfaces, 类型, 通常指定被来历类的接口的类型
3、InvocationHandler h 委托执行的处理类 :日志功能
4、动态创建代理类
5、执行被代理类方法,并收集日志信息
弱点:必须保证被代理的类必须实现了接口
cglib动态代理
不需要接口
相对AOP来说还是增加了开发成本,判断被代理类是否实现了接口
没有办法注册到IOC容器中
为什么选用AOP?
通过@注解标记在被代理的位置,实现方式更简单、更灵活
自动判断是否实现了接口
实现了,采用jdk动态代理
没实现,采用cglib动态代理
创建的被代理类的代理对象会存到IOC容器里边去
aop还可以从方法执行前、执行后、异常后、方法后切入
核心概念及术语
切面(Aspect)
指关注点模块化,这个关注点可能会横切多个对象
在Spring AOP中,切面可以使用通用类基于模式的方式(schemabased approach)或者在普通类中以@Aspect注解(@AspectJ 注解方式)来实现
连接点(Join point)
在程序执行过程中某个特定的点
在Spring AOP中,一个连接点总是代表一个方法的执行
通知(Advice)
在切面的某个特定的连接点上执行的动作
许多AOP框架,包括Spring在内,都是以拦截器做通知模型的,并维护着一个以连接点为中心的拦截器链
通知有多种类型
前置通知:
在连接点之前运行但无法阻止执行流程进入连接点的通知(除非它引发异常)
代码示例
后置通知(总会执行)):
当连接点退出的时候执行的通知(无论是正常返回还是异常退出)
代码示例
后置异常通知
在方法抛出异常退出时执行的通知
代码示例
后置返回通知
在连接点正常完成后执行的通知
代码示例
环绕通知:
环绕连接点的通知
调用方法需要我们自己做
代码示例:
切点(Pointcut)
匹配连接点的断言
通知和切点表达式相关联,并在满足这个切点的连接点上运行
切点表达式如何和连接点匹配是AOP的核心:Spring默认使用AspectJ切点语义
引入(Introduction)
目标对象(Target object)
AOP代理(AOP proxy)
织入(Weaving)
AOP 使用
AOP简单配置及应用
1、加入两个依赖
2、设置扫描包、开启AOP注解
3、被管理的类,注册到IOC容器
4、在切面类上加@Aspect和@Component
使用@Aspect声明为切面
使用@Component将切面交给SpringIOC容器管理
5、在切面类的方法上加@Before等,并编织切入点
使用@After等注解,设置通知类型
编写execcution表达式,设置通知切入到哪些地方
6、重点说明:
在没有使用aop的情况下 :class cn.tulingxueyuan.service.impl.UserServiceImpl
当使用了aop的情况下:
class com.sun.proxy.$Proxy19
class cn.tulingxueyuan.service.impl.UserServiceImpl$$EnhancerBySpringCGLIB$$f281cf64
7、代码示例:
AOP使用详解
切入点表达式
execution(常用):
用于匹配方法执行连接点
可以匹配到方法级别 ,细粒度
这是使用Spring AOP时使用的主要切点标识符
语法:
代码示例:
within常用:
通过类名进行匹配
只能匹配类这级
只能指定类, 类下面的某个具体的方法无法指定, 粗粒度
语法:
this:匹配实现了某个接口:this(com.xyz.service.AccountService)
target:根据某个类匹配
args:按参数匹配
@annotation常用:
限制匹配连接点(在Spring AOP中执行的方法具有给定的注解)。
在加了这个注解的地方切入
合并切点表达式
&&,并且
||,或
!,非
通知方法的执行顺序
1、正常执行:@Before>@After>@AfterReturning
2、异常执行:@Before>@After>@AfterThrowing
获取方法的详细信息
添加JoinPoint参数
获取方法名:joinPoint.getSignature().getName();
获取所有参数:joinPoint.getArgs();
获取返回值:
获取异常:
获取方法上注解的信息:
表达式的抽取
可以采用 声明切点的方式 让其他通知引用, 更重用性
Spring对通知方法的要求
并不是很高,你可以任意改变方法的返回值和方法的范文修饰符
但唯一不能修改的就是方法的参数
基于XML配置的AOP配置
xml配置:
java代码:
0 条评论
下一页