Spring学习(四)AOP-面向切面切面的编程技术

AOP的基本概念:
在软件行业里,AOP为Aspect Oriented Programming的缩写, 意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
AOP将应用系统分为两个部分:核心业务逻辑以及横向的通用逻辑,也就是所谓的面。
例如:所有大中型都要涉及到的持久化的管理、事物管理、安全管理、日志管理以及调试管理等等。

在Spring当中,提供了面向切面编程丰富的支持,允许通过分离应用的业务逻辑与系统级的服务进行内聚性的开发。应用对象只实现他们应该做的,也就是完成业务逻辑,仅此而已。他们并不负责,甚至是不会意识到其他的系统级别的关注点,例如:日志和事物支持等等。

AOP与OOP的关系?
在软件行业当中,AOP是对OOP面向对象编程的一种有益的补充。同时,AOP也是OOP的延续,是软件开发中的一个热点,也是Spring框架当中一个非常重要的内容。我们可以这么理解:
面向对象编程OOP是从静态角度考虑程序结构,即OOP对业务处理过程中的实体以及属性和行为进行了抽象的封装,以获得更加清晰,高效果的国际化氛围,研究的是一种静态的领域。
面向切面的编程AOP是从动态角度考虑程序运行过程,即是针对业务处理过程中的切面进行提取,他所面对的是处理过程中的某个步骤或者阶段,研究的是一种动态的领域。

那么AOP的主要功能是什么呢?
主要是用于系统级别的功能,例如:日志记录、性能统计、安全控制、事物处理、异常处理等等这些主要功能。

那么接下来介绍下AOP的主要意图:
AOP主要是将日志记录,性能统计,安全控制,事物处理,异常处理等代码从业务逻辑代码中划分出来。通过对这些行为的分离,我们希望可以将他们独立到非指导性业务逻辑方法当中。继而改变这些行为的时候,不影响业务逻辑代码的处理。
也就是说:AOP把一些常用的服务进行模块化,并且使用声明的方式将这些组件使用到其他的业务组件当中去。这样做的结果就是每一个业务组件只需要关心自己的业务逻辑,而不要去了解一些常用的服务组件,这样就保证了更高的内聚性。

AOP的存在价值:
AOP 专门用于处理系统中分布于各个模块中的交叉关注点的问题,在 Java EE 应用中,常常通过 AOP 来处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等,AOP 已经成为一种非常常用的解决方案

那么我们为什么要用到AOP呢?
是因为由于系统会有很多不同的组件,每一个组件负责一块特定的功能。然而呢,我们希望每一个组件只关心他自身的核心功能,但是在系统中会有一些组件比如日志模块,事物管理模块和安全模块等等这些组件会比较频繁的融入到其他核心业务逻辑组件当中去。
这些常用的组件会分散到其他多个组件当中,这样会带来的麻烦是:
1.如果这些常用的组件经常发生变化,那么我们需要在多个其他相应组件当中进行修改。
2.这样使得我们的组件代码因为插入了与自身业务无关的核心组件而变的很混乱。
那么,为了更好的说明这个问题,轻看下面的例子:

                            图1                                                                        图2
如图1所示,现在假设系统当中有三段完全相似的代码,这些代码通常会使用复制,粘贴的方式来完成。通过这种复制,粘贴方式所开发出来的软件就像这幅图中所描述的一样。但是,如果有一天图中深色的代码需要修改,那么是不是得打开三个地方进行修改。那如果是一千个地方,一万个呢???

那么为了解决这个问题,我们通常会将深色的代码封装为一个方法,而在其他的地方进行调用这个方法,在这种方式下软件系统的结构如图2所示。对于如图2 所示的软件系统,如果需要修改深色部分的代码只要修改一个地方就可以了。通过这种方式就大大降低了软件后期维护的复杂度。对于如图2 当中的三个方法当前依然需要显式的进行调用,这样做能够解决大部分的应用场景。

但对于一些更特殊的情况,应用需要三个方法彻底与深色方法相分离,那么我没呢应该如何解决呢?
解决这个问题的办法就是AOP
AOP专门处理系统中分布于各个模块当中而且是分布于各个不同的方法当中的交叉管理组点的问题。
在J2EE应用当中,通常通过AOP来处理一些具有横切性质的系统级服务。例如:事物管理、安全检查、缓存、对象池的管理等等。
AOP已经成为一种非常常用的解决方案。

接下来我们来分析下AOP的原理
通过之前的学习我们知道AOP代理其实是由AOP框架动态生成的一个对象,该对象可以作为目标对象使用,AOP代理所包含的方法和目标对象的方法如下图所示:

如图:

AOP实际上是由目标类的代理类所实现的,AOP代理实际上是由AOP框架动态生成的一个对象,该对象可以作为目标对象使用,AOP代理包含了目标对象的全部方法。
但AOP中的方法与目标对象中的方法存在着差异:
AOP方法在特定侵入点添加了增强处理并回调了目标对象的方法。

那么纵观AOP编程,其中程序员参与的只有三个部分:
1.定义普通业务组件
2.定义切入点,一个切入点可能会横切多个业务组件
3.定义增强处理,增强处理就是在AOP框架为普通业务组件置入的处理动作。

可以看出来定义AOP编程的重点就是:定义切入点和定义增强处理
一旦定义了合适的切入点和增强处理,AOP框架将会自动生成AOP代理。

而AOP代理的方法大致有如下的公式:
代理对象的方法 = 增强处理 + 被代理对象的方法

以下是AOP的关键概念的解释:
  • 切面 – Aspect:切面是一个关注点的模块化,这个关注点可能会横切多个对象。事物管理是J2EE当中一个过于横切关注点的很好的例子。在Spring的AOP当中,切面可以使用基于模式的或者说基于Aspect的注解方式进行实现。通俗一点说:就是我们加入的切面类。比如说我们通常所说的日志类。
  • 连接点 - Join Point:是在程序执行过程中的某个特定的点。比如某方法调用的时候,或者说处理异常的时候。在Spring的AOP过程当中一个连接点总是表示一个方法的执行。通俗的说:就是加入切点的那个点。
  • 通知 – Advice:是个切面某个特定连接点上所执行的动作,其中包括了around、before和after等不同类型的通知。许多AOP的框架都是以连接器作为模型,并且维护一个以连接点为中心点连接器链。
  • 切入点 - Point Cut:是匹配连接点的断言。通知和一个切入点表达式并联,并在满足这个切入点的连接点上运行。切入点表达式如何和连接点匹配,是AOP的核心。Spring缺省是使用AspectJ切入点语法。
  • 引入 – Introduction:是用来给一个类型声明额外的方法和属性,Spring允许使用新的接口到任何被代理的对象。例如:你可以使用一个引入来使一个Bean来实现isModify的接口,以便简化缓存机制。
  • 目标对象 - Target Object:被一个或者多个切面所通知的对象,也被称作被通知对象。既然AOP是通过运行时代理实现的,那么这个对象永远是一个被代理的对象。
  • AOP代理 - AOP Proxy:AOP框架创建的这个对象,他用来实现切面契约。在Spring当中,AOP代理可以是JDK动态代理或者是CGLIB代理。
  • 织入 – Weaving:把切面连接到其他应用程序类型或者对象之上,并创建一个被通知的对象。这些可以在类加载的时候,运行的时候或者编译的时候来完成。Spring和其他的纯JAVA对象一样,在运行的时候来完成织入。

总结:
AOP通俗的理解:
一个组件A,不关心其他常用的服务组件B,但是这个组件A使用组件B的时候,不是组件A自身去调用,而是通过配置等其他方式,比如Spring中可以通过xml配置文件。这样就使得A压根就不需要知道服务组件B是怎样的,爱存在不存在,爱怎么存在都与A无关。A只关心自己的业务逻辑,具体A使用B的时候,配置文件去做,与具体的A组件无关。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值