`

spring学习

阅读更多
Spring面向切面编程(AOP)

      AOP全名Aspect-Oriented Programming,中文直译为面向切面(方面)编程,是近两三年来流行起来的

一种编程思想。
       使用AspectJ中,我们可以定义一个切面,代码如下:
public aspect MyAspect{
   void around():call(void Component.business*(..))
   {
    validateUser();
    beginTransaction();
    proceed();//执行其方法中的代码
    endTransaction();
    writeLogInfo();
   }
}
       这样,所有Component组件中返回值为void、名称以business开头的方法都会自动具有了用户验证

(validateUser())事务处理(beginTransaction()/endTransaction())、日志记录(writeLogInfo())等功能。假

如要进一步使某一个包中的所有名称以business开头、返回值为void的方法都具有上面的功能。则只需要把上面的

MyAspect中的内容修改一下即可,如
void around():call(void springroad.demo..business*(..))
{
   ......
}
在AOP中,我们把前面示例中分散程序各个部分,解决同样问题的代码片段,称为问题的切面(或方面)。
一个切面可以简单的理解为解决跨越多个模块的交叉关注点问题(大多数是一些系统级的或者核心关注点外围的问题)

的模块。通过AOP可以使用一种简单、灵活的方式,在切面中实现了以前需要在各个核心关注点中穿插的交叉关注的功

能,从而似的解决系统中交叉关注点问题的模块更加容易设计、实现及维护。  
提供对AOP编程方法支撑的平台称为AOP实现或框架,比如AspectJ、JBoos AOP、Spring AOP等。

* AOP中的一些相关术语介绍

* 关注点
关注点就是我们要考虑或解决的问题。比如在一个电子商务系统中,订单的处理,用户的验证、用户日志的

记录等都属于关注点(Core Concerns)。核心关注点,是指一个系统中的核心功能,也就是一个系统中跟特定业务

需求练习最紧密的商业逻辑。

* 切面
切面是一个抽象的概念,从软件的角度来说是指在应用程序不同模块中的某一个领域或方面。从程序抽象的

角度来说,可以对照OOP中的类来理解。OOP中的类(class)是实现世界模块的一个抽象,其包括方法、属性、实现

的接口、继承等。而AOP中的切面(aspect)是实现世界领域问题的抽象,它除了包括属性、方法以外,同时切面中还

包括切入点Pointcut、增强(advice)等,另外切面中还可以给一个现存的类添加属性、构造函数,指定一个类实现

某一个接口、继承某一个类等。

* 连接点(Join point)
连接点也就是运用程序执行过程中需要插入切面模块的某一点。连接点主要强调的是一个具体的“点”概念。

这个点可以是一个方法、一个属性、构造函数、类静态初始化块。甚至一条语句。比如前面的例子中,连接点就是具体

的某一个方法。

* 切入点(Pointcuts)
切入点指一个或多个连接点,可以理解成一个点的集合。切入点的描述比较具体,而且一般会跟连接点上下

文环境结合。在大多数AOP框架实现中,切入点还支持集合运算,可以把多个切入点通过一定的组合,形成一个新的切

入点。在AspectJ中,可以使用||、&&、!等操作符来组合得到一个符合特定要求的切入点。如:
pointcut setter(): target(UserInfo) && (call(void set*(String)) || call(void set*(int)));
表示所有UserInfo类中的所有带一个String或int型参数的setter方法。
pointcut transaction():target(service.)&&call(* save*(..))
表示service包中所有以save开头的方法。

* 增强或通知(Advice)
Advice一词不管翻译成建议、通知或者增强,都不能直接反映其内容,因此本书主要使用“增强”这一叫法

。当然也可以把其仅看作是一个简单名词的来看待。增强(Advice)里面定义了切面中的实际逻辑(即实现),比如日志的

写入的实际代码,或是安全检查的实际代码。换一种说法增强(Advice)是指在定义好的切入点处,所要执行的程序代码

。比如,下面的话都是用来描述增强(Advice)的例子:“当到达切入点seeter时,检查该方法的参数是否正确”、“在

save方法出现错误这个切入点,执行一段错误处理及记录的操作”。一般情况下,增强(通知)主要有前增强、后增强、环

绕增强三种基本类型。
前增强(before advice)-是指在连接点之前,先执行增强中的代码。
后增加(after advice)-是指在连接点执行后,再执行增强中的代码。后增强一般分为连接点正常返回增

加及连接点异常返回增强等类型。
环绕增强(around advice)-是一种功能强大的增强,可以自由改变程序的流程,连接点返回值等。在环绕

增强中除了可以自由添加需要的横切功能以外,还需要负责主动调用连接点(通过proceed)来执行激活连接点的程序。


* 引介(Introduction)
引介是指一个现有类田间方法或字段属性,引介还可以在不改变现有类代码的情况下,让现有的java类实现

新的接口,或者为其指定一个父类从而实现多重继承。相对于增强(Advice)可以让一个现有为实现

java.lang.Cloneable接口,从而可以通过clone()方法复制这个类的实例。

* 织入(weaving)
织入是指把解决横切问题的切面模板,与系统中的其他核心模块通过一定策略或规则组合到一起的过程。

* 拦截器(interceptor)
拦截器是用来实现对连接点进行拦截,从而在连接点前或后加入自定义的切面模块功能。在大多数JAVA的

AOP框架实现中,都是使用拦截器来实现字段访问及方法调用的拦截(interception)。所用作用于同一个连接点的多个

拦截器组成一个连接器链(interceptor chain),链接上的每个拦截器通常会调用下一个拦截器。Spring AOP及JBoos

AOP实现都是采用拦截器来实现的。
* 目标对象(Target object)
指在基于拦截器机制实现的AOP框架中,位于拦截器链上最未端的对象实例。一般情况下,拦截器未端都包

含一个目标对象,通常也就是实际业务对象。当然,也可以不使用目标对象,直接把多个切面模块组织到一起,形成一

个完整最终应用程序,整个系统完全使用基于AOP编程方法实现,这种情况少见。
* AOP代理(proxy)
AOP代理是指在基于拦截器机制实现的AOP框架中,实际业务对象的代理对象。这个代理对象一般被切面

模块引用,AOP的切面逻辑正是插入在代理对象中来执行的。AOP代理的包括J2SE的代理以及其它字节码生成工具生

成的代理两种类型。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics