Spring框架在国内的软件开发早已是全面普及了,开发中使用Spring主要是为了它的三种特点:1. IOC容器管理各层的组件 2.AOP配置声明式事务 3.整合其它框架。上一篇我们探究了一下IOC是怎么回事,这回我们来探究另一个Spring的重要思想:面向切面编程。
首先假设一个情景:我们要编写一款银行的业务软件,要求可以实现查询、取款、存款等功能,那么不用多说,你也肯定知道大致的流程和下面差不多:
把验证用户用一个模块代替了,查询的业务和取款也差不多。
它们里面有个相同的流程,圈起来让大家看的清楚
那么把这段代码提出来,需要的时候再往里面注入,岂不是省下了许多的代码量?这就是AOP的作用,你在写代码的时候不需要考虑验证用户这部分逻辑,告诉Spring需要往哪加,Spring会帮你完成这项工作,而不是你自己copy过去。
或许这里你会疑惑:我平时写代码也是如此的啊,提出为共通方法到时候在引用不是一样吗?AOP和这个其实有区别。
假如有两个流程:一个是X,A,Y;另一个是X,B,Y。写程序的时候两种方法分别是XAY和XBY,但这里明显出现了代码的重复,不是最优雅的编程方式。你可以分别把X,Y抽象出为共通方法,但至少还要有句话来调用,实际的流程就是xAy和xBy,重复依旧存在。如果用控制反转做的话,就要用模板的方式处理,在抽象父类方法体定义X?Y,其中?为抽象方法,由子类去具体实现,但这样又出现了继承,耦合性太强不灵活。这时就是AOP的功能大显身手的时候了,Spring的AOP模式,实际是给调用者已经加工过的对象,你写的是A,但调用者拿到的是xAy,x和y什么时候调用需要你来规定,这种基于约定的声明就是切点。
AOP是对OOP的补充,它们并不冲突。
所以AOP的本质是在一系列纵向的控制流程中,把那些相同的子流程提取成一个横向的面,这句话应该好理解吧,我们把纵向流程画成一条直线,然把相同的部分以绿色突出,如下图左,而AOP相当于把相同的地方连一条横线,如下图右,这个图没画好,大家明白意思就行。
转载自:https://my.oschina.net/yanquan345/blog/203415