视频链接:https://www.bilibili.com/video/BV1q94y1o7ts?vd_source=9545770e4a2968c05878ffac8589ec6c
视频选集:P39— P76
AOP ( Aspect Orient Programming),面向切面编程。面向切面编程是从动态角度考虑程序运行过程。AOP底层,就是采用动态代理模式实现的。采用了两种代理:JDK的动态代理,与CGLIB的动态代理。
切面:公共的,通用的,重复的功能称为切面,面向切面编程就是将切面提取出来,单独开发,在需要调用的方法中通过动态代理的方式进行织入。
业务:图书购买业务
切面:事务
创建新module:
然后对目录框架和pom.xml进行修改
第二个版本
父类:
子类:
测试:
第三个版本
定义接口:
实现接口功能:
静态代理对象:
测试:
添加商品购买业务:
测试:
事务切面实现:
代理对象:
测试:
当切入多个切面的功能:
测试:
在service中增加业务:
测试:
理论概念:
Spring 原生AOP代码实现:
业务接口:
业务实现:
测试:
日志切面:
绑定在一起的原因:在.xml中进行绑定,不需要定义代理了
注意:底层调用的依然是Proxy.newProxyInstance
AspectJ是一个优秀面向切面的框架,它扩展了Java 语言,提供了强大的切面实现。它因为是基于java语言开发的,所以无缝扩展.easy to learn and use(易学易用).
AspectJ常见通知类型:
AspectJ的切入点表达式(掌握):
规范公式:
简化后的公式:
用到的符号:
举例:
在目标方法执行前切入切面功能.在切面方法中不可以获得目标方法的返回值,只能得到目标方法的签名
实现的步骤:
测试:
在接口中定义一个新方法:
实现方法:
切面不变
测试:【调用show方法,切面没有切入,因为切面中的切入点指的非常详细】
当把切面中的@Before改了后就可以切入了
第一种修改方法:
第二种修改方法:【推荐使用】
第三种修改方法:
第四种修改方法:【不推荐使用】
将SomeService换为SomeServiceImpl后:
重新绑定就可以进行切面切入
总结:
把声明对象的方式改为注解的方式
第一步:
第二步:
第三步:
测试:
JoinPoint是一个接口,获取目标方法的各种信息
将切面修改:
效果:
流程分析:
代码实现【不修改返回值】:
测试:
结果:
代码实现【修改返回值】:
①对String类型的数据修改
总结:String类型不可修改
②对引用数据进行修改
定义student实体类:
在接口中添加方法:
实现方法:
修改切面方法:
测试:
它是通过拦截目标方法的方式,在目标方法前后增强功能的通知.它是功能最强大的通知,一般事务使用此通知.它可以轻易的改变目标方法的返回值
流程分析:
代码实现:
定义接口:
接口实现类:
切面类:
配置文件:
测试:
结果:
无论目标方法是否正常执行,最终通知的代码都会被执行.
接口+接口实现:
切面方法:
配置文件:
测试:
修改目标方法:
再次测试:
先在切面类中添加各种通知【添加多个切面】:
测试结果:
问题:好多切入点表达式都重复了,需要重新进行取别名
如果多个切面切入到同一个切入点,可以使用别名简化开发.使用@Pointcut注解,创建一个空方法,此方法的名称就是别名.