Spring核心技术原理-(2)-经过Web开发演进过程了解一下为何要有Spring AOP?

上一篇:数据库

Spring核心技术原理-(1)-经过Web开发演进过程了解一下为何要有Spring?编程

上一篇从Web开发演进过程的一个侧面简述了一下为何会有Spring?事实上只介绍了为何会有Spring IOC(控制反转/依赖注入)以及Spring IOC的雏形。咱们都知道Spring的两个核心知识点是:IOC和AOP。所以,这一篇仍是以Web开发演进过程为线索继续探讨一下为何会有Spring AOP?等介绍完这两个核心的知识点以后,才会进一步展开对Spring核心原理的探讨!后端

1、Web开发演进到必定阶段的痛点

咱们在初学习Java Web的时候,应该都经历了如下的阶段:设计模式

(1)一个主函数main中包含了全部的方法; (2)将主函数中的方法进行拆分封装,抽取为一个个的方法; (3)按照每个方法不一样的功能分为一个个的类; (4)有了MVC模型以后,咱们按照MVC的思想将咱们的代码拆分为三层,每层负责不一样的功能,进行分门别类的管理;微信

不少程序的功能还能够经过继承关系而获得重用,进一步提升了开发效率。再后来,又出现了各类各样的设计模式,使设计程序功能变得驾轻就熟。网络

在面向对象的大环境下,咱们能够很好地组织代码,经过继承、封装和多态的思想去设计一个个比较让人满意的类,可是咱们慢慢的发现,咱们的代码中逐渐多了不少重复性的代码,有人可能会想到,把这些重复性的代码抽取出来不就行了吗?是这样的,咱们看一下这种思路的一个实例:多线程

这里写图片描述

能够看到,上述代码功能上确实能够实现,可是咱们的业务代码已经被这些非核心的代码所混淆,而且占据了大量的空间!显然这种显示的调用过程成为了咱们开发过程当中的一个痛点,如何将相似这种的非核心的代码剥离出去成为一个迫切须要解决的问题!app

不只如此,假设咱们要控制每个方法的访问权限,只容许一部分用户进行访问,在不考虑过滤器的状况下,咱们是否是须要在每个方法开始的时候判断用户是否具备该权限,若是有的话就能够进行访问,若是没有的话,就不容许进行访问!框架

诸如此类,还有数据库事务的控制,数据库链接的建立和关闭等等,这些都充斥这大量重复性的模板代码!一个很现实的问题,假若有一天,业务需求不须要进行日志记录了,那岂不是咱们须要把之前写的代码,所有删掉!想一想都是一件很可怕的事情!分布式

2、使用设计模式进行一次改进

若是你对设计模式玩的比较熟的话,这个时候你可能会想到使用JDK动态代理设计模式(动态代理设计模式能够在原有的方法先后添加判断、选择或其余逻辑)对上述代码进行改进,(关于什么是JDK动态代理,这里再也不详细赘述,有不懂的的能够查阅相关资料具体了解一下!)修改后的代码以下:

这里写图片描述

上述为代理类,红色框中圈出的表示之前业务中的模板代码,这里直接输出表示方法执行的过程,之前的UserServiceImpl修改成以下(直接用输出的方式表示方法执行了):

这里写图片描述

测试代码以下:

这里写图片描述

上述的执行结果能够看出,每次调用一个方法的时候先后都会调用咱们指望的代码,实现了咱们指望的标准!

经过JDK动态代理的方式,让咱们完全的解放出来了!

3、撕开披在AOP身上的一层薄纱

上述过程当中,咱们看到在动态代理的invoke方法里边,咱们至关于在原有方法的调用先后“植入”了咱们的通用日志记录代码,若是你看到这一层的话,那么恭喜你!你已经领悟到了AOP思想最核心的东西了!上述抽取公共代码其实就是AOP中横切的过程,代理对象中在方法调用先后“植入”本身写的通用日志记录代码其实就是AOP中织入的过程!这个织入的代码也就是横切逻辑,织入代码的过程其实就是在原有的方法先后加强 原方法的过程!总的来讲,咱们想解决咱们开发中的痛点,而后就出现了一种技术,这种技术手段就是AOP。

AOP书面表述以下:

AOP(Aspect Oriented Programming)意为:面向切面编程,经过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容(Spring核心之一),是函数式编程的一种衍生范型。利用AOP能够对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度下降,提升程序的可重用性,同时提升了开发的效率。

这里写图片描述

4、AOP与Spring AOP的关系

AOP是一种思想,不一样的厂商或企业可能有不一样的实现方式,为了更好的应用AOP技术,技术专家们成立了AOP联盟来探讨AOP的标准化,AOP联盟定义的AOP体系结构把与AOP相关的概念大体分为由高到低、从使用到实现的三层关系,AOP联盟定义的AOP体系结构以下图:

这里写图片描述

在AOP联盟定义的AOP体系结构下有不少的实现者,例如:AspectJ、AspectWerkz、JBoss AOP、Spring AOP等。Spring AOP就是在此标准下产生的,这里再也不深刻Spring AOP的其余概念,这些概念会在后期探讨。

5、其余问题

上述经过动态代理的方式实现了简单的AOP,可是值得注意的是,咱们的代理目标对象必须实现一个接口,要是一个接口的实现类,这是由于再生成Proxy对象的时候这个方法须要一个目标对象的接口:

这里写图片描述

显然,这种特殊的场景使用JDK动态代理的技术已经不可以知足咱们的使用场景了,又遇到痛点了!凡事不劳咱们操心的Spring框架已经替咱们想到了,既然你有这种需求,我就使用一种技术帮你实现就好了,Spring在这里使用CGLib的代理方式实现了咱们的这种诉求。

CGLib采用底层的字节码技术,能够为一个类建立子类,在子类中采用方法拦截的技术拦截全部父类方法的调用并顺势的织入横切逻辑。

看到这里,咱们会想之后会不会还有CGLib解决不了得问题啊?咱们已经很清楚的知道了对于Spring AOP来讲,使用到了JDK动态代理技术和CGLib动态代理技术,这两种方式已经实现了咱们绝大多数的场景,若是还有不能知足的需求,迫切须要解决的痛点,我相信可能还会有相应的技术实现AOP。

6、总结

上述的过程,大体从一个侧面探讨了一下咱们为何须要AOP,AOP与Spring AOP的关系以及Spring AOP两种实现的方式(JDK动态代理和CGLib动态代理)。

Spring不尝试提供最为完善的AOP实现,它更侧重于提供一种和Spring IOC容器整个的AOP实现,用于解决实际的问题,在Spring中无缝的整合了Spring AOP、Spring IOC和AspectJ。

固然,Spring AOP的内容不只仅有这些!例如:咱们在使用Spring AOP的时候只是简单的配置了一下(经过XML或注解进行配置),没有像ProxyDemo测试类中的那样,还须要咱们手动的调用ProxyFactory 来建立代理对象,而后调用咱们的目标方法,其实Spring AOP在内部已经帮咱们把这些事情作好了,具体的原理后期会继续探讨。另外,Spring如何整合Spring IOC和AOP的,这一点也会在后期探讨。

最后补充一下!动态代理或者设计模式重要吗?很重要!Spring AOP用到了动态代理,Spring事务管理用到了动态代理,MyBatis数据库链接池用到了动态代理,MyBatis建立Mapper用到了动态代理等等,你说重要不!要想踏进这些高层框架原理的大门,设计模式首先是咱们的第一段台阶!

在这里插入图片描述

【视频福利】2T免费学习视频,搜索或扫描上述二维码关注微信公众号:Java后端技术(ID: JavaITWork)回复:1024,便可免费获取!内含SSM、Spring全家桶、微服务、MySQL、MyCat、集群、分布式、中间件、Linux、网络、多线程,Jenkins、Nexus、Docker、ELK等等免费学习视频,持续更新!

相关文章
相关标签/搜索