AOP的基本概念程序员
AOP从运行的角度考虑程序的流程,提取业务处理过程的切面。AOP面向的是程序运行中的各个步骤,但愿以更好的方式来组合业务逻辑的各个步骤。AOP框架并不与特定的代码耦合,AOP框架能处理程序执行中特定切入点,而不与具体某个类耦合(即在不污染某个类的状况下,处理这个类相关的切点)。下面是一些AOP的一些术语:编程
切面(Aspect):业务流程运行的某个特定步骤,也就是应用运行过程的关注点,关注点一般会横切多个对象,所以常被称为横切关注点服务器
链接点(JoinPoint):程序执行过程当中明确的点,如方法调用,或者异常抛出。Spring AOP中,链接点老是方法调用。架构
加强处理(Advice):AOP框架在特定的切入点执行的加强处理。处理有around,before,after等类型。(说明:AOP是比较前沿的知识,而大部分国内翻译人士在翻译计算机文献时,老是一边看各类翻译软件和词典,一边逐字逐句的翻译,而不是先去从整体上把握知识的架构。所以不免致使一些术语翻译的词不达意,在AOP的术语上也存在较大差别,对于Advice一词,有人翻译为“通知”,有人翻译为“建议”......实际上,Advice是指AOP框架在特定切面所加入的某种处理,笔者这里翻译为“加强处理”,但愿能够表达出Advice的真正含义)框架
切入点(PointCut):能够插入加强处理的链接点。简而言之,当某个链接点知足执行要求时,该链接点将被添加加强处理,该链接点也就变成了切入点。例如:spa
pointcut xxxPointcut():execution(void H*.say*())
每一个方法被调用都只是链接点,但若是该方法属于H开头的类,且方法名以say开头,按该方法的执行将变成切入点。如何使用表达式来定义切入点是AOP的核心,Spring默认使用AspectJ切入点语法。.net
引入:将方法或字段添加到被处理的类中。Spring容许引入新的接口到任何被处理的对象翻译
目标对象:被AOP框架进行加强处理的对象,也被称为加强的对象。若是AOP框架是经过运行时代理来实现的,那么这个对象将是一个被代理的对象。代理
AOP代理:AOP框架建立的对象,简单地说,代理就是对目标的对象的增强。Spring中AOP代理能够是JDK动态代理,也能够是CGLIB代理。前者为实现接口的目标对象的代理,后者为不实现接口的目标对象的代理。code
织入(Weaving):将加强处理添加到目标对象中,并建立一个被加强的对象(AOP代理)的过程就是织入。织入有两种实现方式:编译时加强(如AspectJ)和运行时加强(如CGLIB)。Spring和其余纯Java AOP框架同样,在运行时织入。
由前面的介绍知道:AOP代理实际上是由AOP框架动态生成的一个对象,该对象可做为目标对象使用。AOP代理包含了目标对象的所有方法,但AOP代理中的方法与目标对象的方法存在差别:AOP方法在特定切入点增长了加强处理,并回调了目标对象的方法。
Spring的AOP支持
Spring中AOP代理由Spring的IoC容器负责生成、管理。其依赖关系也由IoC容器负责管理。所以AOP代理能够直接使用容器中的其余Bean做为目标,这种关系可由IoC容器的依赖注入提供。Spring默认支持使用JDK动态代理来建立AOP代理,这样就能够为任何接口实现建立代理了。
Spring也支持CGLIB代理,在须要代理类而不是代理接口的时候,Spring自动会切换为使用CGLIB代理。但Spring推荐使用面向对象编程,所以业务对象一般都会实现一个或多个接口,此时默认将使用JDK动态代理,但也能够强制使用CGLIB。
Spring AOP使用纯Java实现。它不须要专门的编译过程。Spring AOP不须要控制类装载器的层次,所以它能够在全部JavaWeb容器或应用服务器中运行良好。
Spring目前仅支持将方法调用做为链接点(JoinPoint),若是须要把对Field的访问和更新也做为加强处理(Advice)的链接点,则能够考虑使用AspectJ。
Spring实现AOP框架跟其余的框架不一样。Spring并非要提供最完整的AOP实现(尽管Spring AOP有这个能力),而是侧重于AOP实现和Spring IoC之间的整合,用于帮助解决在企业级开发中的常见问题。所以,Spring一般和IoC容器一块儿使用,Spring历来就没有经过提供一种全面的AOP解决方案来与AspectJ竞争。Spring AOP采用基于代理的AOP实现方案,而AspectJ则采用编译时加强的解决方案。
Spring2.0能够无缝的整合Spring AOP、IoC和AspectJ,是的全部的AOP应用彻底融入基于Spring的框架,这样的集成不会影响Spring AOP API或者AOP Alliance API,Spring AOP保持了向下兼容性,依然容许直接使用Spring AOP API来完成AOP编程。
一旦咱们掌握了AOP的概念,不难发现进行AOP编程是一件很简单的事情。纵观AOP编程,其实须要程序员参与的只有三个部分:
定义普通的业务组件
定义切入点(PointCut),一个切入点可能横切多个业务组件
定义加强处理(Advice),加强处理及时在AOP框架为普通业务组件织入时的处理动做
第一部分是最为日常的事情了,无需说明。第2、三部分就是AOP的关键:一旦定义了合适的切入点和加强处理,AOP框架将会自动生成代理,而AOP代理的方法大体有以下公式:
代理对象的方法 = 加强处理 + 被代理对象的方法
Spring 1.x采用自身提供的AOP API来定义切入点和加强处理,程序能够直接使用Spring AOP API来定义切入点和加强处理,但这种方式彷佛有些过期了,如今一般建议使用AspectJ方式来定义切入点和加强处理,在这种方式下,Spring依然有以下两种选择来定义切入点和加强处理:
基于注解的配置方式:使用@Aspect ,@Pointcut等注解来标注切入点和加强处理
基于XML配置文件的方式
【未完,待续】