AOP术语

转载 2011年12月20日 17:17:53
====关注点(Concern)====
关注点就是我们要考察或解决的问题。如订单的处理,用户的验证、用户日志记录等都属于关注点。
 
关注点中的核心关注点(Core Concerns),是指系统中的核心功能,即真正的商业逻辑。如在一个电子商务系统中,订单处理、客户管理、库存及物流管理都是属于系统中的核心关注点。
 
还有一种关注点叫横切关注点 (Crosscutting Concerns),他们分散在每个各个模块中解决同一样的问题,跨越多个模块。如用户验证、日志管理、事务处理、数据缓存都属于横切关注点。
 
AOP的编程方法中,主要在于对关注点的提起及抽象。我们可以把一个复杂的系统看作是由多个关注点来有机组合来实现,一个典型的系统可能会包括几个方面的关注点,如核心业务逻辑、性能、数据存储、日志、授权、安全、线程及错误检查等,另外还有开发过程中的关注点,如易维护、易扩展等。
 
 
====切面(Aspect) ====
 
切面是一个关注点的模块化,这个关注点可能会横切多个对象和模块,事务管理是横切关注点的很好的例子。它是一个抽象的概念,从软件的角度来说是指在应用程序不同模块中的某一个领域或方面
Spring 2.0 AOP中,切面可以使用基于XML Schema的风格或者以@Aspect注解@AspectJ风格)来实现
 
下面的例子是基于xml schema风格来定义一个Aspect(红字部分)
<aop:aspect id="aspectDemo" ref="aspectBean">
<aop:pointcutid="myPointcut" expression="execution(* package1.Foo.handle*(..)"/>
<aop:beforepointcut-ref="myPointcut" method="doLog" />
</aop:aspect>
 
这个定义的意思是:每执行到package1.Foo类的以handle开头的方法前,就会先执行aspectBeandoLog方法
 
 
====连接点(Join point) ====
 
连接点就是在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。这个点可以是一个方法、一个属性、构造函数、类静态初始化块,甚至一条语句。而对于SPRING 2.0 AOP来说,连接点只能是方法,这个一定要记住~!每一个方法都可以看成为一个连接点,只有被纳入某个CutPointJointPoint才有可能被Advice
 
通过声明一个org.aspectj.lang.JoinPoint类型的参数可以使通知(Advice)的主体部分获得连接点信息。
 
JoinPoint与CutPoint之间的关系见下面的CutPoint的讲解
 
====切入点(Pointcuts) ====
切入点指一个或多个连接点,可以理解成连接电点的集合. Advice是通过Pointcut来连接和介入进你的JointPoint的。
 
比如在前面的例子中,定义了
<aop:pointcutid="myPointcut"
expression="execution(* package1.Foo.handle*(..)"/>
那么这就是定义了一个PointCut,该Pointcut表示“在package1.Foo类所有以handle开头的方法”
假设package1.Foo类里类似于:
    Public class Foo{
       public handleUpload(){..}
       public handleReadFile(){..}
       .....
    }
那么handleUpload是一个JointPoint,handleReadFile也是一个Joint,那么上面定义的id=”myPointcut”的PointCut则是这两个JointPoint的集合
 
====通知(Advice) ====
Advice定义了切面中的实际逻辑(即实现),比如日志的写入的实际代码。换一种说法Advice是指在定义好的切入点处,所要执行的程序代码
 
通知有以下几种:
前置通知(Before advice:在切入点匹配的方法执行之前运行使用@Before注解来声明
 
返回后通知(After returning advice:在切入点匹配的方法返回的时候执行。使用 @AfterReturning注解来声明
 
抛出后通知(After throwing advice: 在切入点匹配的方法执行时抛出异常的时候运行。使用 @AfterThrowing注解来声明
 
后通知(After (finally) advice:不论切入点匹配的方法是正常结束的,还是抛出异常结束的,在它结束后(finally)后通知(After (finally) advice)都会运行。使用 @After注解来声明。这个通知必须做好处理正常返回和异常返回两种情况。通常用来释放资源。
 
环绕通知(Around Advice:环绕通知既在切入点匹配的方法执行之前又在执行之后运行。并且,它可以决定这个方法在什么时候执行,如何执行,甚至是否执行。在环绕通知中,除了可以自由添加需要的横切功能以外,还需要负责主动调用连接点(通过proceed)来执行激活连接点的程序。 请尽量使用最简单的满足你需求的通知。(比如如果前置通知也可以适用的情况下,就不要使用环绕通知)
 
环绕通知使用 @Around 注解来声明。而且该通知对应的方法的第一个参数必须是ProceedingJoinPoint类型。在通知体内(即通知的具体方法内),调用 ProceedingJoinPoint  proceed() 方法来执行连接点方法
 
 
====引入(Introduction) ====
引入是指给一个现有类添加方法或字段属性,引入还可以在不改变现有类代码的情况下,让现有的Java类实现新的接口以及一个对应的实现)。相对于Advice可以动态改变程序的功能或流程来说,引介(Introduction)则用来改变一个类的静态结构。比如你可以使用一个引入来使bean实现 IsModified 接口,以便简化缓存机制
 
 
====目标对象(Target Object====
被一个或者多个切面(aspect)所通知(advise)的对象。也有人把它叫做 被通知(advised) 对象。 既然Spring AOP是通过运行时代理实现的,这个对象永远是一个 被代理(proxied)对象。
 
 
====AOP代理(AOP Proxy====
AOP框架创建的对象,用来实现切面契约(aspect contract)(包括通知方法执行等功能)。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。注意:Spring 2.0最新引入的基于模式(schema-based)风格和@AspectJ注解风格的切面声明,对于使用这些风格的用户来说,AOP代理的创建是透明
 
Spring缺省使用J2SE 动态代理(dynamic proxies来作为AOP的代理。这样任何接口都可以被代理。
Spring也支持使用CGLIB代理对于需要代理类而不是代理接口的时候CGLIB代理是很有必要的如果一个业务对象并没有实现一个接口,默认就会使用CGLIB作为面向接口编程的最佳实践,业务对象通常都会实现一个或多个接口。
====织入(Weaving====
把切面(aspect)连接到其它的应用程序类型或者对象上,并创建一个被通知(advised)的对象,这样一个行为就叫做Weaving。 这些可以在编译时(例如使用AspectJ编译器),类加载时和运行时完成。 Spring和其他纯Java AOP框架一样,在运行时完成织入
 
其实织入的方式有3种:
1、运行时织入-即在java运行的过程中,使用Java提供代理来实现织入。根据代理产生方式的不同,运行时织入又可以进一步分为J2SE动态代理及动态字节码生成两种方式。由于J2SE动态代理只能代理接口,因此,需要借助于一些动态字节码生成器来实现对类的动态代理。大多数AOP实现都是采用这种运行时织入的方式,包括Spring
 
2、类加载器织入-指通过自定义的类加载器,在虚拟机JVM加载字节码的时候进行织入,比如AspectWerkz(已并入AspecJ)JBoss就使用这种方式
 
3、编译器织入-使用专门的编译器来编译包括切面模块在内的整个应用程序,在编译的过程中实现织入,这种织入是功能最强大的。编译器织入的AOP实现一般都是基于语言扩展的方式,即通过对标准java语言进行一些简单的扩展,加入一些专用于处理AOP模块的关键字,定义一套语言规范,通过这套语言规范来开发切面模块,使用自己的编译器来生成java字节码。AspectJ主要就是是使用这种织入方式
 
PS:
连接点(join point):它是指应用中执行的某个点,即程序执行流程中的某个点。如执行某个语句或者语句块、执行某个方法、装载某个类、抛出某个异常……,Spring目前只支持方法级别的。
切入点(pointcut):切入点是连接点的集合,它通常和通知(Advice)联系在一起,是切面和程序流程的交叉点。比如说,定义了一个pointcut,它将抛出异常ClassNotFoundException和某个通知联系起来,那么在程序执行过程中,如果抛出了该异常,那么相应的通知就会被触发执行。Spring中是实现了MethodInterceptor,通俗一点说,在连接点上,切入点决定在什么情况下调用哪个Advice。
装备(advice):指切面在程序运行到某个连接点所触发的动作。在这个动作种我们可以定义自己的处理逻辑。通知需要利用切入点和连接点联系起来才会被触发。目前AOP定义了五种通知:前置通知(Before advice)、后置通知(After advice)、环绕通知(Around Advice)、异常通知(After throwing advice)、返回后通知(After returning advice)。

相关文章推荐

AOP编程术语-通知

  • 2017年01月21日 13:33
  • 6.49MB
  • 下载

Spring 面向切面-AOP术语

1、面向切面的原因和好处 在软件开发中, 散布于应用中多处的功能被称为横切关注点( crosscutting concern) 。 通常来讲, 这些横切关注点从概念上是与应用的业务逻辑相分离的( 但...

AOP术语详解

==== 关注点 (Concern)====  关注点就是我们要考察或解决的问题。如订单的处理,用户的验证、用户日志记录等都属于关注点。   关注点中的核心关注点 (Core Concerns)...

Spring之AOP术语

AOP是Aspect Oriented Programing的简称,被译为“面向切面编程”。 AOP独辟蹊径通过横向抽取机制为这类无法通过纵向继承体系进行抽象的重复性代码提供了解决方法。如何将这些独...
  • bruce_6
  • bruce_6
  • 2014年06月22日 14:59
  • 1035

结合Java实例代码来理解 AOP--面向切面编程 中的各个术语

因为这个AOP--面向切面编程是基于动态代理模式的,所以,要想搞清楚这个AOP,就必须得先了解下,什么是代理模式,什么又是动态代理模式。动态代理模式的2种实现方式。 现在假设,你已经可以看得懂动态代理...

Spring的AOP框架的主要术语

代理(Proxy)是由AOP框架生成的一个对象,用来
  • lms1719
  • lms1719
  • 2014年05月18日 00:08
  • 997

AOP之术语及增强类型简介

主要术语JoinPoint(连接点):一个要被拦截的方法 Pointcut(切点):在execution表达式里面声明的一个或多个方法被拦截方法的集合 advice (增强):应用在被拦截方法中...

结合代码彻底理解Spring AOP的术语

每本Spring的书在介绍AOP之前,总能有一箩筐的术语,看半天似懂非懂,也就没兴趣再继续学习下去,其实并没有这么复杂。 难懂的定义我们就不贴了,就说说咱们通俗的解释,下面让我们结合代码来理清楚各个术...

Spring AOP 术语解释

转自: 1.我所知道的aop    初看aop,上来就是一大堆术语,而且还有个拉风的名字,面向切面编程,都说是OOP的一种有益补充等等。一下子让你不知所措,心想着:怪不得很多人都和我说aop多...

面向切面编程(AOP)——基本术语

在软件开发的过程中,有些行为对于大多数应用都是通用的,最常见的通用行为就是事务管理。事务管理是实际数据库应用中必不可少的功能,不能算是真正的业务逻辑,它是为了保证数据的安全性,与具体的业务逻辑并无关系...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:AOP术语
举报原因:
原因补充:

(最多只允许输入30个字)