Spring AOP 面向切面编程(一)

来源:互联网 发布:鲨鱼网络直播 编辑:程序博客网 时间:2024/05/06 11:58

             本文章为读书笔记,文献参考《Spring in Action 第二版 中文版》。

 

             当然文章一上来也是一些无聊的解释,对于AOP术语的解释,大都不是很直观,所以我这里先将书中的解释抄录下来,然后再加上我自己理解的解释,然后再附上图片,在图片上标注一些解释信息,这样,尽量将这些术语解释的清晰一些,以便后边的讲解更明白。

             通知(Advice):切面的功能被称为“通知”,通知定义了切面是什么,何时使用。如它应该引用在某个方法被调用之前、之后、之前和之后、或是只在方法抛出一个异常时?

             连接点(Joinpoint):连接点是在程序执行过程中能够插入切面的一个点。这个点可以是方法被调用时、异常抛出时、甚至字段被编辑时。切面的代码可以通过这些点插入到程序的一般流程之中,从而添加新的行为。

             切入点(Pointcut):一个切面不是一定要通知程序里全部连接点。切入点可以缩小切面通知的连接点的范围。切入点定义了切面的“何地”使用。切入点的定义匹配要织入的一个或多个连接点。我们通常使用明确的类和方法名称,或是,利用正则表达式定义匹配的类和方法名称模板来指定这些切入点。有些AOP框架允许创建动态切入点,可以根据运行时的状态(比如方法的参数值)来应用切面。

             切面(Aspect):切面是通知和切入点的结合。通知和切入点共同定义了关于切面的全部内容--他的功能,在何时和何地完成这个功能。

             引入(Introduction)“引入”允许我们向现有的类添加新的方法和属性。(这个定义我还是不太明白)

             目标(Target)“目标”是被通知的对象。它可以是我们编写的任何一个对象或是第三方对象。如果不使用AOP,那么这个对象就只能自己处理主要的业务逻辑(保存数据)和交叉事务的逻辑(日志记录)。使用了AOP,那么这两个业务逻辑就可以分开了。目标对象只负责出路主要的业务逻辑(保存数据)。交叉事务的逻辑(日志记录)交给“通知”来处理。

             代理(Proxy“代理”是向“目标对象”应用“通知”之后被创建的对象。对于我们来说目标对象(在应用AOP之前的对象)和代理对象(在应用AOP之后的对象)是一样的。

             织入(Weaving织入把切面应用到目标对象创建新代理对象过程切面在指定的连接点(切入点)织入到目标对象。在目标对象的生命周期中有至少三个时机可以发生织入过程编译时、类加载时、运行时。

            Spring对AOP的支持是基于代理的且局限于方法注入这是SpringAOP织入切面的方式。它是在运行时被织入,在织入切面时,Spring AOP会创建一个代理对象来委托给目标对象(Proxy设计模式)。AspectJ是基于编译时的,AspectJ 5是基于类加载时的。

             下面是我对这几个术语的解释,我会举一个简单的例子。

              交叉事务:若是保存数据,记录日志两个操作都在同一个方法中完成或是在同一个类中完成,那么可以说这就是记录日志就是交叉事务。1、先将数据记录到log中,2,、保存数据,3、保存成功之后记录保存结果,4、发生异常了还要记录异常信息。如下如所示:

            通知(Advice)像这种交叉事务在程序中有成百上千的地方会用到,就如 图1  所示的那样。而这些交叉事务的代码又很相同,因此我们可以将这些交叉事务抽出来,让我们的主业务去处理主要的事务,不让交叉事务影响我的视线。这样我们既达到了代码重用的效果,也不影响程序的正常开发。抽象出来的这部分事务就可以笼统的叫做“通知(Advice)”。如下图所示,LogTest类就是一个通知类。

               上边的“通知(Advice)”术语中说,1、通知定义了切面是什么。就上边的LogTest来说,我们的通知定义了切面是记录日志的东西。2、何时使用。还是LogTest来看,三个方法分别定义了saveObject之前,saveObject之后,saveObject发生异常时,当然这三个时刻那个都可以,或是其中的一两个也可以。想想通知其实就是抽出来的交叉事务

               连接点(Joinpoint简单的说主业务逻辑中的每个业务方法加起来一起被称为连接点(Joinpoint)。如上图的Test类中的saveObject方法,若是有updateObject,deleteObject,getObject方法的,这些方法统一就做连接点。仔细想想就是主业务中的方法。我们可以在这些连接点上加入我们的通知代码。如上图2所示,所有的   菱形  统一叫做连接点,这些连接点就是主程序执行中的那些方法。至于如何加入,后边介绍。

               切入点(Pointcut)我们将通知加入到主业务连接点(方法)中,但不可能在主业务的所有连接点(方法)中加入通知,我们会选择其中一个或几个连接点加入通知。这样我们就缩小了连接点的范围。这其中的一个或几个连接点(方法)就被称作“切入点(Pointcut)”。如上图2所示,中间的箭头表示的就是切入点,它会选择其中的一个或几个方法加入。如上图Test方法中的saveObject方法就是一个切入点,我们可以在保存数据的前、后、异常时进行日志记录。这样的话切面的”何地“的解释就出来了。

               切面(Aspect)如上边的术语所说,将通知和切入点组合起来就是切面(Aspect)。用我自己的话来简单的概括一句就是:在程序运行时将LogTest类的功能加入到Test类的saveObject方法上去。

               目标(Target)即是目标对象。就是将通知(LogTest)加入到的指定的业务对象(Test)。如上图所示Test对象就是目标对象,如果不是用AOP,那么记录日志的和保存数据的工作就都有这个Test一力承担了。使用AOP将交叉业务分离出去,承载主业务的对象就是目标对象(Target)。

               代理(Proxy)即代理对象。上边文字也说了Spring对AOP的支持是基于代理的,就是说,我们将通知加入到目标对象之后,Spring AOP会创建一个目标对象的代理对象。这个代理对象会包裹着目标对象,当我们将通知中的方法应用到目标对象中的方法时,其实是将通知中方法交给我了代理对象,然后代理对象在转交给目标对象。如图3所示。

               织入(Weaving)我的理解是将通知通过切点加入到目标对象然后创建一个目标对象的代理的过程。

 

 

             对于以上的解释,还有很多欠缺的地方,我会对Spring AOP由浅入深理解的同时做出修改。
原创粉丝点击