两个月前跟着b站动力节点王鹤老师的Spring框架教程视频学习完了Spring框架,在学习过程中我将视频中涉及的代码都一行一行手敲了一遍,并且把Spring入门相关的资料整理了一下,在这里记录一下我在Spring框架学习过程中的笔记和一些心得,希望能帮助到想要通过文字教程入门Spring这一框架的小伙伴哦!
视频地址:2020最新Spring框架教程【IDEA版】-Spring框架从入门到精通
文章目录- AOP 面向切面编程
- 1. 不使用 AOP 的开发方式
- 2. 回顾动态代理
- 3. AOP 简介
- 4. AOP 编程术语
- (1)切面(Aspect)
- (2)连接点(JoinPoint)
- (3)切入点(Pointcut)
- (4)目标对象(Target)
- (5)通知(Advice)
Step1:项目 aop_leadin1
先定义好接口与一个实现类,该实现类中除了要实现接口中的方法外,还要再写两个非业务方法。非业务方法也称为交叉业务逻辑:
➢ doTrans():用于事务处理
➢ doLog():用于日志处理
然后,再使用接口方法调用它们。接口方法也称为主业务逻辑。
接口:
实现类:
Step2:项目 aop_leadin2
当然,也可以有另一种解决方案:将这些交叉业务逻辑代码放到专门的工具类或处理类中,由主业务逻辑调用。
工具类:
实现类:
Step3:项目 aop_leadin3
以上的解决方案,还是存在弊端:交叉业务与主业务深度耦合在一起。当交叉业务逻辑较多时,在主业务代码中会出现大量的交叉业务逻辑代码调用语句,大大影响了主业务逻辑的可读性,降低了代码的可维护性,同时也增加了开发难度。
所以,可以采用动态代理方式。在不修改主业务逻辑的前提下,扩展和增强其功能。
功能增强:
2. 回顾动态代理AOP 底层,就是采用动态代理模式实现的。采用了两种代理:JDK 的动态代理,与 CGLIB 的动态代理。
1. 动态代理
jdk 动态代理:使用 jdk 中的 Proxy,Method,InvocaitonHanderl 创建代理对象。jdk 动态代理要求目标类必须实现接口。
cglib 动态代理:第三方的工具库,创建代理对象,原理是继承。 通过继承目标类,创建子类,子类就是代理对象。 要求目标类不能是 final 的, 方法也不能是 final 的。
2. 动态代理的作用:
- 在目标类源代码不改变的情况下,增加功能。
- 减少代码的重复
- 专注业务逻辑代码
- 解耦合,让业务功能和日志、事务、非业务功能分离。
AOP(Aspect Orient Programming),面向切面编程。面向切面编程是从动态角度考虑程序运行过程。AOP 底层,就是采用动态代理模式实现的。采用了两种代理:JDK 的动态代理,与 CGLIB 的动态代理。
Aop 就是动态代理的规范化, 把动态代理的实现步骤、方式都定义好了,让开发人员用一种统一的方式,使用动态代理。
AOP 为 Aspect Oriented Programming 的缩写,意为:面向切面编程,可通过运行期动态代理实现程序功能的统一维护的一种技术。AOP 是 Spring 框架中的一个重要内容。利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
怎样理解面向切面编程?
面向切面编程,就是将交叉业务逻辑(即给目标类增强的功能)封装成切面,利用 AOP 容器的功能将切面织入到主业务逻辑中, 便于减少系统的重复代码**,**降低模块间的耦合度,并有利于未来的可拓展性和可维护性。 所谓交叉业务逻辑是指,通用的、与主业务逻辑无关的代码,如安全检查、事务、日志、缓存等。
若不使用 AOP,则会出现代码纠缠,即交叉业务逻辑与主业务逻辑混合在一起。这样,会使主业务逻辑变的混杂不清。
例如:转账,在真正转账业务逻辑前后,需要权限控制、日志记录、加载事务、结束事务等交叉业务逻辑,而这些业务逻辑与主业务逻辑间并无直接关系。但是它们的代码量所占比重能达到总代码量的一半甚至还多。它们的存在,不仅产生了大量的“冗余”代码,还大大干扰了主业务逻辑——转账。
面向切面编程的好处:
-
减少重复;
-
专注业务;
注意:面向切面编程只是面向对象编程的一种补充。
面向切面编程注意点:
- 需要在分析项目功能时,找出切面
- 合理地安排切面的执行时间(在目标方法前, 还是目标方法后)
- 合理地安排切面执行的位置,在哪个类,哪个方法增加增强功能
切面泛指交叉业务逻辑,即增强的功能,实际就是对主业务逻辑的一种增强。上例中的事务处理、日志处理就可以理解为切面。常用的切面是通知(Advice)。 常见的切面功能有日志,事务,统计信息,参数检查,权限验证。
(2)连接点(JoinPoint)连接点指可以被切面织入的具体方法 ,连接业务方法和切面的位置。通常业务接口中的方法均为连接点。
(3)切入点(Pointcut)切入点指声明的一个或多个连接点的集合。通过切入点指定一组方法。
(4)目标对象(Target)被标记为 final 的方法是不能作为连接点与切入点的。因为最终的是不能被修改的,不能被增强的。
目标对象指将要被增强的对象 。即包含主业务逻辑的类的对象 。给哪个类的方法增加功能,则该类称为目标类,该类对象称为目标对象。当然,不被增强,也就无所谓目标不目标了。
(5)通知(Advice)通知表示切面的执行时间,Advice 也叫增强。上例中的 MyInvocationHandler 就可以理解为是一种通知。换个角度来说,通知定义了增强代码切入到目标代码的时间点,是目标方法执行之前执行,还是之后执行等。通知类型不同,切入时间不同。
切入点定义切入的位置,通知定义切入的时间。
切面有三个关键的要素: 1)切面的功能代码,切面要干什么 2)切面的执行位置,使用Pointcut表示切面执行的位置 3)切面的执行时间,使用Advice表示时间,在目标方法之前,还是目标方法之后。



