AOP
Spring的AOP简介
AOP是什么
- AOP为Aspect Oriented Programming,意思是面向切面编程,是通过预编译方式和运行期动态代理实现程序工程的统一维护的一种技术
- AOP是OOP的延续。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高开发效率
AOP的作用以及优势
作用:在程序运行期间,在不修改源码的情况下对方法进行功能增强
优势:减少重复代码,提高开发效率,并且便于维护
AOP的底层实现
AOP的底层是通过Spring提供的动态代理技术实现的。在运行期间,Spring通过动态代理技术动态的生成代理对象,代理对象方法执行时进行增强功能的介入,在去调用目标对象的方法,从而完成功能的增强
AOP的动态代理技术
JDK的动态代理
JDK代理:基于接口的动态代理技术
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PodmXRMF-1646142120060)(C:\Users\maybe3032\AppData\Roaming\Typora\typora-user-images\image-20220301170448646.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zIyGHYY5-1646142120061)(C:\Users\maybe3032\AppData\Roaming\Typora\typora-user-images\image-20220301171638220.png)]
cgllib的动态代理
cglib代理:基于父类的动态代理技术
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VT1yM1Rd-1646142120062)(C:\Users\maybe3032\AppData\Roaming\Typora\typora-user-images\image-20220301170455742.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tFRqi17C-1646142120062)(C:\Users\maybe3032\AppData\Roaming\Typora\typora-user-images\image-20220301185416287.png)]
AOP相关概念
Spring的AOP实现底层就是对上面的动态代理的代码进行了封装,封装后我们只需要对需要关注的部分进行代码编写,并通过配置的方法完成指定目标的方法增强
AOP相关术语
· Target(目标对象):代理的目标对象
· Orixy(代理):一个类被AOP织入增强后,就产生了一个结果代理类
· Joinpoint(连接点):所谓连接点是指那些被拦截到的点,在spring中,这些点指的是方法,因为spring只支持方法类型的连接点(所有的可以被增强的方法)
· Pointcut(切入点):所谓切入点是指我们要对哪些Joinpoint进行拦截的定义(真正可以被增强的方法)
· Advice(通知/增强):所谓通知是指拦截到Joinpoint之后要做的事情就是通知
· Aspect(切面):是切入点和通知的结合(切入和增强的结果)
· Weaving(织入):是指吧增强应用到目标对象来创建新的代理对象的过程。spring采用动态代理织入,而AspectJ采用编译器织入和类装载器织入(切入和增强的过程)
AOP开发明确的事项
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PlosehzN-1646142120063)(C:\Users\maybe3032\AppData\Roaming\Typora\typora-user-images\image-20220301194408429.png)]
知识要点
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BYRnwGTf-1646142120063)(C:\Users\maybe3032\AppData\Roaming\Typora\typora-user-images\image-20220301194546712.png)]
基于XML的AOP开发
快速入门
-
导入AOP相关坐标
-
创建目标接口和目标类(内部有切点)
-
创建切面类(内部有增强方法)
-
将目标类和切面类的对象创建权交给spring
-
在applicationContext.xml中配置织入关系
<!--目标对象--> <bean id="target" class=" "></bean> <!--切面对象--> <bean id="myAspect" class=" "></bean> <!--配置织入:告诉spring配置 哪些方法(切点)需要进行增强--> <aop:config> <!--声明切面--> <aop:aspect ref="切面类"> <!--切面:切点+增强--> <aop:通知类型 method="切面类中方法名" pointcut="execution([修饰符]返回值类型 包名.类名.方法名(参数))"/> </aop:aspect> </aop:config>
-
测试代码
XML配置AOP详解
- 切点表达式的写法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pA6RBjpg-1646142120064)(C:\Users\maybe3032\AppData\Roaming\Typora\typora-user-images\image-20220301203507585.png)]
- 通知的配置语法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gMjDKhH9-1646142120065)(C:\Users\maybe3032\AppData\Roaming\Typora\typora-user-images\image-20220301203817304.png)]
切点表达式的抽取
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4swHHDkw-1646142120065)(C:\Users\maybe3032\AppData\Roaming\Typora\typora-user-images\image-20220301205419189.png)]
基于注解的AOP开发
快速入门
- 创建目标接口和目标类(内部有切点)
- 创建切面类(内部有增强方法)
- 将目标类和切面类的对象创建权交给spring(@Component)
- 在切面类中使用注解配置织入关系(@Aspect)(@Before(value=""))
- 在配置文件中开启组件扫描和AOP的自动代理
<!--aop自动代理-->
<aop:aspectJ-autoproxy/>
- 测试
注解通知的类型
通知的配置语法:@通知注解(“切点表达式”)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RLCGtI0F-1646142120066)(C:\Users\maybe3032\AppData\Roaming\Typora\typora-user-images\image-20220301213602627.png)]
切点表达式的抽取
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BLaHKlhx-1646142120066)(C:\Users\maybe3032\AppData\Roaming\Typora\typora-user-images\image-20220301213901000.png)]