spring AoP学习 -----AoP的基本概念

    Aop的发展经理过两个阶段,第一个是静态Aop阶段,第二个是动态Aop阶段。

    静态Aop阶段:作为第一代的Aop,以最初的AspectJ为代表,特点是以相应的横切关注点以Aspect形式实现之后,会通过特定的编译器,将实现后的Aspect编译并织入到系统的静态类中,优点是Aspect直接以java字节码的形式编译到java类中,java虚拟机可以像通常一样加载java类运行,不会给系统运行造成任何性能损失。

    动态Aop阶段:作为第二代的Aop,大都通过java语言提供的各种动态特性来实现第一代Aop织入到当前系统的过程,这类产品有:JBoss  AOP,Spring AOP,Naning AOP ,还有就是第一代的AOP产品AspectJ在融合了Aspect Werkz框架之后,成为唯一支持静动态的AOP产品。 优点:灵活易用,和静态Aop最大的不同就是,Aop的注入过程在系统运行开始之后运行,而不是预编译到系统中,而且织入信息大部分采用外部xml,可以动态更改织入逻辑。缺点:带来性能问题,因为大多数Aop的实现都是在类加载或者系统运行期间,采用对系统字节码进行炒作方式来完成Aspect到系统的织入。

    Aop实现机制:  

  1. 动态代理:说有需要织入横切关注点逻辑的模块类都得实现相应的接口,因为动态代理机制只对接口有效,动态代理在运行期间使用反射,相对于编译后的静态类来说,性能稍逊一些
  2. 动态字节码增强:使用asm或者clib等java工具类在程序运行期间,动态构建字节码的class文件,通过动态字节码增强技术,为这些系统模块类生成相应的子类,而将横切逻辑加到这些子类中,让应用程序在执行期间使用的是这些动态生成的子类,从而达到将横切逻辑织入系统的目的。不足: 若类或者方法声明为final的话,则无法对其进行子类化扩展。
  3. java代码生成:早期EJB用得比较多,现在已经基本上不用了。
  4. 自定义类加载器:通过读取外部文件规定的织入规则和必要的信息,在加载class文件期间就可以讲横切逻辑添加到系统模块类的现有逻辑中, 然后将改动后的class交给虚拟机运行。
  5. AOL拓展

  Aop中的术语:

  Joinpoint:在执行Aop功能模块织入到oop的功能模块中时那个执行点称之为JoinPoint。

  较为常见的织入点:

  1. Method Call:当方法调用的时候所处的程序执行点。
  2. Method Call execution :代表的是某个方法内部执行开始时点
  3. Construction Call(构造方法调用):程序执行过程中对某个对象调用其构造方法进行初始化的时点
  4. Constructor Call Execution(构造方法执行):指的是某个对象构造方法内部执行的开始时点。
  5. Field Set (字段设置) 对象的某个属性通过setter哈哈被设置或者直接被设置的时点
  6. 字段获取:对应的是某个对象相应属性被访问的时点
  7. Class initialize(类初始化):指的是类中某些静态类型后再静态块的初始化时点

      这些都是比较常见的joinpoint,其实每一个认为必要的执行时都可以作文joinpoint,但某些位置Aop产品比较难以捕捉。

  Pointcut:是Joinpoint的表述方式。将横切逻辑织入当前系统的过程中,需要产后照pointcut规定的JoinPoint信息。

    pointcut的表述方式:

      1.直接指定joinpoint所在方法名称。

      2.正则表达式

      3.使用指定的pointcut表述语言

  Advice:是单一横切关注点逻辑的载体,他代表将会织入到joinpoint的横切逻辑

      Advice组成的具体形式:

  1. Before Advice :在Joinpoint指定位置之前执行的Advice类型,通常不会中断程序执行流程,但是也可以通过跑出一场的方式来中断流程。
  2. After Advice:在方法回信完成之后调用的advice,又可以细分为三种:after return Advice :当JoinPoint执行流程正常完成后执行;after throwing advice :又称为throw advice,只有在钱JoinPoint执行过程中抛出异常的情况下执行;after finally advice :不管joinpoint处执行流程是正常终止了海仕抛出异常都会执行。
  3. Around Advice对附加其上的Joinpoint进行“包裹”,可以再JoinPoint之前和之后都指定相应的逻辑,甚至于joinpoint中断或者忽略joinpoint处yuanchengxu流程的执行

  Introduction:可以为原有的对象添加新的特征或者行为,Introduction类型的Advice因实现技术的不同,在具体软件环境中可以存在性能差异。

  Aspect:是对系统中的横切关注点逻辑进行模块化封装的Aop概念实体。

  织入和织入器:完成横切关注点逻辑到 系统的最终织入。

          AspectJ有专门的编译器完成织入操作,即ajc,JBoss AOP采用自定义的类加载器来完成最终织入,spring AOP使用一组类来完成最终的织入操作。Proxy Factory类是Spring AOP中最通用的织入器。

  目标对象:符合pointcut所指定的条件,将在织入过程中被织入横切逻辑的对象,称为目标对象(Target Object)

转载于:https://www.cnblogs.com/Qbright/archive/2012/07/23/2599242.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值