视频链接: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注解,创建一个空方法,此方法的名称就是别名.
