1.AOP基本概念:Aspect-Oriented Programming,面向方面编程的简称,Aspect是一种新的模块化机制,用来描述分散在对象、类或方法中的横切关注点(crosscutting concern),从关注点中分离出横切关注点是面向方面程序设计的核心所在。分离关注点使得解决特定领域问题的代码从业务逻辑中独立出来,业务逻辑的代码中不再含有针对特定领域问题代码的调用,业务逻辑同特定领域问题的关系通过方面来封装、维护,这样原本分散在整个应用程序中的变动就可以很好地管理起来。
2.AOP和OOP的区别:
面向方面编程AOP和面向对象编程OOP在字面上虽然非常类似,但却是面向不同领域的两种设计思想。OOP针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。而AOP则是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。
3. AOP常用的技术以及实现:
常用的AOP技术有:
(1).AspectJ:源代码和字节码级别的方面编织器,用户需要使用不同于java的新语言。
(2).AspectWerkz:AOP框架,使用字节码动态编织器和XML配置。
(3).JBoss-AOP:基于拦截器和元数据的AOP框架,运行在JBoss应用服务器上。
AOP中使用的一些实现技术有:、
(1).BCEL:Byte-Code Engineering Library,Java字节码操作类库。
(2).Javassist:Java字节码操作类库,JBoss的一个子项目。
4.面向方面编程(AOP)的常用术语:
(1).切面Aspect: Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些切入点Pointcut 以及对切入点进行相应的操作的通知Advice。
(2).连接点Joint point:表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它连接点jointpoint。
(3).切入点Pointcut:表示一组连接点jointpoint,这些连接点或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的操作处理通知Advice将要发生的地方。
(4).通知Advice:Advice 定义了在切入点pointcut 里面定义的程序点具体要做的操作和处理,它通过 before、after 和 around 来区别是在每个切入点之前、之后还是代替执行的代码。
(5).目标对象Target:代理的目标对象,即切面要被应用到的目标对象。
(6).织入Weave:指将切面应用到目标对象,并导致代理对象创建的过程。
5.AOP的体系结构:
AOP联盟定义的AOP体系结构如下:

层次3语言和开发环境:基础是指待增加对象或者目标对象;切面通常包括对于基础的增加应用;配置是指AOP体系中提供的配置环境或者编织配置,通过该配置AOP将基础和切面结合起来,从而完成切面对目标对象的编织实现。
层次2面向方面系统:配置模型,逻辑配置和AOP模型是为上策的语言和开发环境提供支持的,主要功能是将需要增强的目标对象、切面和配置使用AOP的API转换、抽象、封装成面向方面中的逻辑模型。
层次1底层编织实现模块:主要是将面向方面系统抽象封装的AOP模型编织进待增强的目标对象的实现技术。
6.Advice通知:
Advice通知是AOP联盟定义的一个接口,定义当拦截到连接点做相应的处理操作,为切面增强提供织入接口。在Spring AOP中,通知主要描述Spring AOP围绕方法调用而注入切面的行为,Spring AOP的通知扩展了AOP联盟的通知接口,提供了前置通知BeforeAdvice、后置通知AfterReturnAdvice、最终通知AfterAdvice和例外通知ThrowAdvice等。
(1).以一个方法为例,讲解Spring中通知的类型:
[java] view plaincopy- public 返回类型 方法名(参数列表){ ――>环绕通知 方法前处理代码 ――> 前置通知
- try{ 方法具体实现(方法体)…….
- 方法后处理代码 ――> 后置通知 }Catch(异常类型 e){
- 异常处理…… ――> 例外通知 }finally{
- 最后处理代理…… ――> 最终通知 }
- }
(2).前置通知BeforeAdvice:
a.前置通知的源码如下:
[java] view plaincopy- package org.springframework.aop; import org.aopalliance.aop.Advice;
- public interface BeforeAdvice extends Advice { }
其中Advice是AOP联盟提供的通知接口。
b.前置通知子接口方法前置通知MethodBeforeAdvice:
在前置通知BeforeAdvice的继承关系中,定义了为代增强目标方法设置的前置增强接口方法前置通知MethodBeforeAdvice,源码如下:
[java] view plaincopy- public interface MethodBeforeAdvice extends BeforeAdvice { //前置方法通知的回调方法,在目标对象方法被调用之前调用
- //method参数是目标方法的反射对象,args是目标方法的输入参数数组 void before(Method method, Object[] args, Object target) throws Throwable;
- }
c.前置方法通知实现类CountingBeforeAdvice:
方法前置通知MethodBeforeAdvice接口的实现类比较多,我们以最简单的CountingBeforeAdvice为例,分析方法前置通知所做的具体操作,CountingBeforeAdvice的源码如下:
[java] view plaincopy- public class CountingBeforeAdvice extends MethodCounter implements MethodBeforeAdvice { //实现方法前置通知MethodBeforeAdvice接口的方法
- public void before(Method m, Object[] args, Object target) throws Throwable { //以目标对象方法作为参数,调用父类MethodCounter的count方法统计方法调用次数
- count(m); }
- } CountingBeforeAdvice的父类MethodCounter的源码如下:
- public class MethodCounter implements Serializable { //方法名―>方法调用次数的map集合,存储方法的调用次数
- private HashMap
map = new HashMap (); //所有方法的总调用次数 - private int allCount; //统计方法调用次数,CountingBeforeAdvice的调用入口
- protected void count(Method m) { count(m.getName());
- } //统计指