`

AOP术语(转载)

阅读更多
AOP术语(转载)
2009-07-16 22:12

 

http://kang.iteye.com/blog/326675

====关注点(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开头的方法前,就会先执行aspectBean的doLog方法


====连接点(Join point) ====

连接点就是在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。这个点可以是一个方法、一个属性、构造函数、类静态初始化块,甚至一条语句。而对于SPRING 2.0 AOP来说,连接点只能是方法,这个一定要记住~!每一个方法都可以看成为一个连接点,只有被纳入某个CutPoint的JointPoint才有可能被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主要就是是使用这种织入方式。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/myyate/archive/2008/03/24/2213966.aspx

分享到:
评论

相关推荐

    Spring aop术语详解

    Spring中 aop术语是很难理解的,这里有比较通俗的解释

    spring aop spring aop

    spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop

    spring-aop.jar各个版本

    spring-aop-1.1.1.jar spring-aop-1.2.6.jar spring-aop-1.2.9.jar spring-aop-2.0.2.jar spring-aop-2.0.6.jar spring-aop-2.0.7.jar spring-aop-2.0.8.jar spring-aop-2.0.jar spring-aop-2.5.1.jar spring-aop-...

    开发工具 aopalliance-1.0

    开发工具 aopalliance-1.0开发工具 aopalliance-1.0开发工具 aopalliance-1.0开发工具 aopalliance-1.0开发工具 aopalliance-1.0开发工具 aopalliance-1.0开发工具 aopalliance-1.0开发工具 aopalliance-1.0开发工具...

    AOP编程术语-通知

    前置通知、环绕通知、返回后通知 、后置通知、异常通知

    C# 实现的AOP框架

    C# 实现的AOP框架 转载,高手写的。

    aop例子aop例子

    自己写的aop代理spring

    AOP使用CGLIB实现AOP功能

    Spring AOP实现方法之一:CGLIB 实现AOP功能

    基于注解实现SpringAop

    基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop

    aop所依赖的所有包

    aop所依赖的所有包+文档+源码,最新版全套aop aspectjweaver aopalliance aspects aspectjrt

    spring aop jar 包

    spring aop jar 包

    开发工具 spring-aop-4.3.6.RELEASE

    开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE...

    android aop

    自己写的android aop的例子 可以说明在android开发中如何使用aop编码的

    SpringBoot下的SpringAOP-day04-源代码

    2.2 AOP中专业术语(难点) 2.3 AOP 入门案例 2.3.1 创建一个SpringBoot的module 2.3.1 导入jar包 2.3.2 项目工程结构 2.3.3 配置类 2.3.4 Service层 2.3.4.1 接口 2.3.4.2 实现类 2.3.5 切入点表达式 2.3.6 定义切面...

    反射实现 AOP 动态代理模式(Spring AOP 的实现原理)

    AOP的意思就是面向切面编程。本文主要是通过梳理JDK中自带的反射机制,实现 AOP动态代理模式,这也是Spring AOP 的实现原理

    spring-boot aop

    源代码是spring-boot添加aop切面功能的demo,简单易懂.

    spring-aop实例

    spring aop

    AOP@Work AOP 工具比较

    概述 AOP 工具当前的技术状况,比较对于该技术而言最成熟的一些方法:AspectJ、AspectWerkz、JBoss AOP、和 Spring AOP,并对比与每种方法的采用有关的问题。

    spring中AOP中标签加载通知

    spring中AOP中标签加载通知,spring中AOP中标签加载通知spring中AOP中标签加载通知spring中AOP中标签加载通知,spring中AOP中标签加载通知

    spring_aop.rar

    Spring-Aop 一、Aop的概述 1.1、什么是Aop(摘自百度) 1.2、Aop的相关术语 二、基于XML的AOP配置 三、基于注解的AOP配置

Global site tag (gtag.js) - Google Analytics