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主要就是是使用这种织入方式。

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/myyate/archive/2008/03/24/2213966.aspx

<think>好的,我现在需要帮助用户了解Spring AOP的相关术语。用户提供了四个引用资料,我需要先仔细阅读这些资料,提取关键信息,然后按照用户的要求组织回答。 首先,我要确保回答结构清晰,分点解释每个术语,并且使用中文。同时,根据用户提供的系统级指令,所有行内数学表达式要用$...$,不过这个问题主要涉及编程概念,可能数学表达式不多,但如果有的话要注意格式。独立公式需要用$$...$$,但这里可能不需要。另外,回答中引用的段落末尾要自然地添加引用标识,比如[^1]。 接下来,我需要分析用户提供的引用内容。四个引用都涉及Spring AOP术语,比如AOP的概念、横向抽取、相关术语如切面(Aspect)、连接点(Join Point)、通知(Advice)、切入点(Pointcut)、目标对象(Target)、代理(Proxy)、织入(Weaving)等。每个引用可能对这些术语有不同的描述,我需要综合这些信息,确保准确性和全面性。 然后,我需要按照逻辑顺序组织这些术语,通常是从基本概念开始,逐步深入。例如,先解释AOP本身,然后切入术语,如切面、连接点、通知等。每个术语需要给出定义和可能的例子,以帮助理解。 同时,用户要求生成相关问题,我需要根据内容提出三个相关问题,确保问题与主题相关且有参考价值。例如,关于AOP与OOP的区别,实现方式,通知类型等。 在写作过程中,要避免使用Markdown格式,使用自然的中文口语化表达,但保持专业术语的准确性。需要检查每个引用的内容,确保正确引用来源,比如引用[^1]、[^2]等,并确保引用标识与用户提供的资料对应。 现在开始整理每个术语: 1. **切面(Aspect)**:将横切关注点模块化,如日志、事务管理。引用提到横向抽取机制,引用[^4]提到封装共同行为到可重用模块。 2. **连接点(Join Point)**:程序执行中的特定点,如方法调用或异常抛出。引用[^3]和[^4]可能涉及。 3. **通知(Advice)**:在连接点执行的动作,包括不同类型,如前置、后置等。引用提到方法增强,引用有通知类型。 4. **切入点(Pointcut)**:定义哪些连接点会被通知处理。引用提到切点的配置。 5. **目标对象(Target)**:被代理的原始对象。引用或[^4]可能提到。 6. **代理(Proxy)**:增强后的对象,引用提到代理方式。 7. **织入(Weaving)**:将切面应用到目标对象的过程,引用和提到运行期代理。 需要确保每个术语的解释都有对应的引用来源,并正确标注。然后,生成相关问题,例如: 1. AOP与OOP的主要区别是什么? 2. Spring AOP的通知类型有哪些? 3. Spring AOP的实现方式有哪些? 最后,检查回答是否符合格式要求,没有使用任何Markdown,引用标识正确,语言自然流畅。</think>### Spring AOP 术语详解 Spring AOP(面向切面编程)通过横向抽取机制,将与业务无关的公共逻辑(如日志、事务、权限等)封装为可重用的模块,从而降低代码冗余和耦合度。以下是其核心术语的详细解释: --- #### 1. **切面(Aspect)** 切面是封装横切关注点的模块,例如日志、事务管理等。它由**通知**和**切入点**组成,通过配置定义“在何时何地执行什么操作”。 **示例**:将性能监测代码封装为一个切面,在方法执行前后自动记录耗时。 --- #### 2. **连接点(Join Point)** 连接点是程序执行过程中的一个点,例如方法调用、异常抛出或字段修改。Spring AOP 仅支持方法执行作为连接点[^4]。 --- #### 3. **通知(Advice)** 通知是切面在连接点执行的具体动作,分为以下类型: - **前置通知(Before)**:在方法执行前触发(如权限校验)。 - **后置通知(After)**:在方法执行后触发(无论是否成功,如清理资源)。 - **返回通知(AfterReturning)**:方法成功返回后触发(如记录结果)。 - **异常通知(AfterThrowing)**:方法抛出异常时触发(如错误日志)。 - **环绕通知(Around)**:包裹目标方法,控制其执行(如事务管理)。 --- #### 4. **切入点(Pointcut)** 切入点通过表达式定义哪些连接点需要被通知处理。例如:`execution(* com.example.service.*.*(..))` 表示拦截 `service` 包下所有类的所有方法。 --- #### 5. **目标对象(Target)** 目标对象是被代理的原始对象。例如,一个未被增强的 `UserService` 类实例[^3]。 --- #### 6. **代理(Proxy)** 代理是增强后的对象,由 Spring 动态生成。当调用目标对象的方法时,实际通过代理对象执行,从而织入切面逻辑。 --- #### 7. **织入(Weaving)** 织入是将切面应用到目标对象的过程。Spring AOP 在运行时通过动态代理实现织入,无需修改原始代码。 --- ### 关键优势 - **解耦**:业务代码与非业务逻辑(如日志)分离。 - **复用性**:公共功能集中管理,减少重复代码。 - **灵活性**:通过配置动态增减功能,无需修改源码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值