Spring学习笔记---3-AOP详解

一、AOP概述
      
        AOP是Aspact Oriented Programing 的简称。原位面向方面编程,现在普遍都认为“面向切面编程”更为合理。
        我们先来来比较抽象的,维基百科给的解释:
    
      注解:  个人觉得上面的解释基本是能够让大家大概的了解AOP是干什么的:为了项目中没有支配性分解的部分进行模块化,利用横切的视角类来将之前分散在各个模块中的非业务性功能进行模块化,进而减少这类代码与业务类代码的耦合性,从而然我们的程序更加灵活,健壮。

      更倾向于下图:
       
       重复性的横切逻辑独立出来很容易,但如何将这些独立的逻辑融合到业务逻辑中完成和原来一样的业务操作,这才是事情的关键,这也正是AOP要解决的问题。

       AOP联盟对AOP体系结构如图:      
                       
 

二、术语解释
   
连接点(Joinpoint):
             一个类或一段程序代码拥有一些边界性质的特定点,这些代码中的特定点就称为“连接点”。
             程序执行的某个特定位置,因为Spring仅支持方法的连接点,即仅能在方法调用前、调用后、方法抛出异常以及方法调用前后这些程序执行点织入增强(这里增强的意思就是需要嵌入的逻辑处理);
            这个我们可以用黑客攻击系统需要找到突破口来理解,从这个方面来说,AOP是一个黑客,它是想要在你的业务逻辑之外的指定地点插入额外的代码逻辑,这里的这个Joinpoint (连接点)就是AOP 向目标类打入楔子的候选点。
   
            连接点有两个信息确定:第一个是用方法表示的程序执行点;第二是用相对点表示的方位。如在Test.foo()方法执行前的连接点,执行点为Test.foo(),方位为该方法执行前的位置。Spring使用切点对执行点进行定位,而方位则在增强类型中定义。
           
            注解:用通俗的语言来表示pointcut,就是他是一个目标点,比如我要在靶心的上方十公分处插上一个小箭头,那么靶心就是那个连接点。

切点(PointCut):
           每个程序都可以拥有很多的连接点,如一个拥有两个方法的类,那么这两个方法都是连接点,也就是说连接点是程序类中客观存在的属性或事物。OK,我们有了很多个连接点,也就是说有很多个目标,那个哪个才是我要定位的那个目标呢? AOP通过”切点“定位特定连接点。
       有好几本书上有个类比很形象:用数据库查询的概念来理解切点和连接点的关系;连接点相当于数据库中的记录,而切点相当于查询的条件。切点和连接点不是一对一的关系,一个切点可以匹配多个连接点。

        注解:连接点在程序中基本可以相当于类中的每个方法,关键是我们通过什么样的方式来找到特定的那个连接点;通过什么样的方式----切点。我们通过切点来找到某一个特定的方法,也就是连接点。

增强(Advice):
       增强是织入目标类连接点上的一段程序代码。在Spring中,增强除用于描述一段程序代码外,还拥有另一个和连接点相关的信息,这便是执行点的方位。结合执行点方位信息和切点信息,就可以找到特定的连接点了。正因为增强既包含了用于添加到目标连接点上的一段执行逻辑,又包含了用于定位连接点的方位信息,所以Spring所提供的增强接口都是带方位名的:BeforeAdvice、AfterReturningAdvice、ThrowsAdvice等。BeforeAdvice表示方法调用前的位置,AfterReturningAdvice表示访问返回后的位置。所以只有结合切点和增强才能确定特定的连接点并实施增强逻辑。
    
        注解:增强的作用是,我要先找到一个特定的点,然后给他加一段额外的逻辑代码,就是这个意思。但是我们怎么做到呢?因为要找到特定的点,必须用切点,所以,在一个普通的语文语境下是这样的:我要找到阿三的作业本,在他的作业本上画一条线。上面的话,翻译成Spring的连接点和切点,还有增强的关系就是:我要先找到阿三(连接点),通过阿三,找到作业本(切点),在他的作业本上画一条线(增强)。
 
目标对象(Target):
         增强逻辑的织入目标类。如果没有AOP,目标业务类需要自己实现所有逻辑。在AOP的帮助下,如果一个类中方法只实现那些非横切逻辑的程序逻辑,而性能监视和事务管理等这些横切逻辑就可以使用AOP动态织入特定的连接点上。
     
       注解:这个目标对象的意思就是我要对哪个类做入侵,或者说做我要对哪个类做增强动作。

引介(Instrduction):
         引介是一种特殊的增强,它为类添加一些属性和方法。这样,即使一个业务类原本没有实现某个接口,通过AOP的引介功能,也可以动态的为该业务类添加接口的实现逻辑,让业务类成为这个接口的实现类。(没用过,暂不多说)
     
织入(Weaving):
          织入是将增强添加对目标类具体连接点上的过程,AOP像一台织布机,将目标类、增强或者引介通过AOP这台织布机天衣无缝的编制在一起。根据不同的实现技术,AOP有三种织入的方式:
          1:编译期织入,这要求使用特殊的Java编译器;
          2:类装载期织入,这要求使用特殊的类装载器;
          3:动态代理织入,在运行期为目标类添加增强生成子类的方式。
          Spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入。

代理(Proxy):
           一个类被AOP 织入增强后,就产出了一个结果类,它是融合了原类和增强类的代理类。根据不同的代理方式,代理类既可能和原类具有相同接口的类,也可以是原类的子类,所以可以采用与调用类相同的方式调用代理类。

切面(Aspect):
           切面由切点和增强(引介)组成,它既包括了连接点的定义,SpringAOP就是负责实施切面的框架,它将切面所定义的横切逻辑织入切面所指定的连接点中。

          AOP的工作重心在于如何将增强应用与目标对象的连接点上,这里首先包括两个工作:第一i,如何通过切点和增强定位连接点上;第二,如何在增强中编写切面的代码。
     
          下图是拿Baidu百科中的相应解释,会将概念之间的关系表述的很好:

         

三、增强类型
        前置增强,就是在执行特定业务逻辑之前执行一段代码,如在客户进门前,服务员说:欢迎光临。
        后置增强:在客户点餐之后,告诉客户,您的餐在25分钟之内全部上完,否则,您可以要求全额退款。
        环绕增强:就是既有前置增强,又有后置增强。
        异常抛出增强:就是在发生错误时的增强,最适合的应用场景是事务管理。

四、 小结:
         AOP工具的设计目标是把横切的问题(如性能监视,事务管理)模块化。使用类似于OOP的方式进行切面的编程工作。位于AOP工具核心的是连接点模型,它提供了一种机制,可以识别出哪里发生了横切。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值