spring--AOP、AspectJ

 AOP

  Aspect Oritented Programming的缩写,面向切面编程。

  是通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。

  AOP是一个概念,没有设定具体的语言。它克服了那些只有单继承特性的语言的缺点。

  spring2.0后整合了AspectJ的技术

 

 AspectJ 

  是一个面向切面的框架。扩展了java语言,AspectJ定义了aop的语法,

  所以它有一个专门的编译器用来生成遵守java的字节编码的规范的class文件。

 

  aop:主要的功能:日志记录、性能统计、安全控制、事务处理、异常处理等。

  (在调用service层的时候,进行一个横切,进行代理。然后再进行service层的触发。)

 

 AOP和OOP的区别

  1、oop:(面向对象编程)是对业务处理过程的实体、属性和行为进行抽象的封装,

    来获得更加清晰高效的逻辑单元划分。

    2、aop:(面向切面编程)是对业务处理过程中切面的提取。面对的是处理过程中的

    每一个步骤和阶段。以获得逻辑过程中的各部分之间的低耦合性的隔离效果,

 

  AOP的相关术语

  1、target  ( 目标对象 ):指需要被增强的对象。 由于spring aop的通过代理模式实现的。

            这个对象永远都是被代理对象。

  2、join point ( 连接点 ): 指被拦截的点 ( 方法 ) ; spring支持方法类型的连接点。

  3、pointcut ( 切入点 ) :  指一组 join point ; 通过逻辑关系组合起来,或通过通配、正则表达式等方式集中起来。

            定义了相应的Advice将要发生的地方。

 4、advice ( 通知 ):就是拦截到连接点之后,需要做的事情。 通知分为前置通知、后置通知、异常通知、

          最终通知、环绕通知、定义了在pointcut 里面定义的程序点具体要做的操作。

  5、introduction ( 引介 ) : 是一种特殊的通知。在不修改类代码的前提下。可以在运行期间为类动态的添加一些方法或属性。

  6、aspect ( 切面 ) :是切入点和通知的结合。

  7、weaving ( 织入 ) : 是一个过程,是将切面应用到目标对象从而创建出aop代理对象的过程。

          织入可以在编译期,类装载期,运行期进行。 spring使用动态织入。aspectJ使用静态织入。

  8、proxy ( 代理 ) : 一个类被aop织入增强后,就产生一个结果代理类。

 

  AOP的底层开发

AOP分为静态aop和动态aop。

静态aop:是指aspectJ实现的aop,将切面代码直接编译到java类文件中。

动态aop:是spring实现的aop,将切面动态的织入实现的aop。

 

 实现技术:JDK动态代理、CGLIB动态代理。

JDK动态代理:在运行期间JVM会动态的生成class字节码对象(class对象) (只针对接口操作)  

CGLIB动态代理 (Code Generation Library):是一个开源的项目。在运行期间扩展java类与实现java的接口。

CGLIB的底层是使用一个快而小的字节码框架ASM,来转换字节码并生成新的类。

 

如果是单独使用。侧需要导入:cglib、asm的jar包;但是使用spring来开发,侧需要导入spring-core的jar包。

 

AOP传统开发

需要导入核心jar包和依赖jar包

 

传统开发中有5种开发:org.springframework.aop.包下

  MethodBeforeAdvice:前置通知;AfterReturningAdivce:后置通知;

  MethodInterceptor:环摇通知;ThrowsAdivce:异常通知;

  IntroductionInterceptor:引介通知

 

传统的aop开发,需要每一步都手动创建,并实现。

  在上传的文件中有源码。

 

基于aspectJ的开发

基于aspectJ开发,和传统的相比就是配置的时候,基于aspectJ。这样开发起来比较简单。

还需要导入aspectj的包。aspectJ.weaver的jar包

 

在上传的文件中有源码。

配置的正则表达式还有

spring--AOP、AspectJ

 

 

AspectJ基于xml开发aop

spring框架在默认的情况下,是对有接口的类使用proxy代理的。

<aop:config proxy-target-class="false">

 false: 代表有接口使用proxy代理;     

true : 使用cglib代理,不考虑是否有接口。

在上传的文件中有源码。

 

AspectJ注解开发

直接是在类里面使用注解。然后在配置文件中进行一个代理。

在上传的文件中有源码。

 

 

 

 

 

 

 

上一篇:Android Aspectj 接入 - 非组件


下一篇:Spring的AspectJ的AOP