您的位置:首页 > 运维架构

AOP基本概念

2013-12-26 14:33 106 查看
原文地址:AOP基本概念作者:迎风飞扬
一、关注点(Concern)

关注点就是要考察或解决的问题。如订单处理,用户验证、日志记录等都属于关注点。

核心关注点(Core
Concerns),是指系统中的核心功能,即真正的商业逻辑。一个电子商务系统核心关注点:订单处理、客户管理、库存及物流管理。

横切关注点
(Crosscutting
Concerns),他们分散在每个各个模块中解决同一样的问题,跨越多个模块。如用户验证、日志管理、事务处理、数据缓存都属于横切关注点。

在AOP的编程方法中,主要在于对关注点的提起及抽象。一个复杂的系统可看作是由多个关注点来有机组合来实现,一个典型的系统可能会包括的关注点:核心业务逻辑、性能、数据存储、日志、授权、安全、线程及错误检查等;开发过程中的关注点:易维护、易扩展等。

二、切面(Aspect)

切面是一个关注点的模块化,这个关注点可能会横切多个对象和模块,事务管理是横切关注点的很好的例子。它是一个抽象的概念,从软件的角度来说是指在应用程序不同模块中的某一个领域或方面。对照OOP中的类来理解。OOP中的类(class)是实现世界模板的一个抽象,AOP中的切面(aspect)是实现世界领域问题的抽象;切面还可给现存的类添加属性、构造函数,指定一个类实现某一个接口、继承某一个类等。

三、连接点(Join
point)

连接点就是在程序执行过程中需要插入切面模块某个特定的点,比如某方法调用的时候或者处理异常的时候。这个点可以是一个方法、一个属性、构造函数、类静态初始化块,甚至一条语句。

通过声明一个org.aspectj.lang.JoinPoint类型的参数可以使通知(Advice)的主体部分获得连接点信息。

四、切入点(Pointcuts)

切入点指一个或多个连接点,可以理解成连接电点的集合.
Advice是通过Pointcut来连接和介入进你的JointPoint的。

在AOP框架实现中,切入点可支持集合运算,把多个切入点通过一定的组合,形成一个新的切入点。在AspectJ中,可以使用||、&&、!等操作符来组合得到一个符合特定要求的切入点。

五、通知(Advice)

Advice定义了切面中的实际逻辑(即实现),比如日志的写入的实际代码。换一种说法Advice是指在定义好的切入点处,所要执行的程序代码。

通知的类型:

1、前置通知(Before advice):在切入点匹配的方法执行之前运行使用@Before注解来声明。

2、返回后通知(After returning advice):在切入点匹配的方法返回的时候执行。使用
@AfterReturning注解来声明。

3、抛出后通知(After throwing advice): 在切入点匹配的方法执行时抛出异常的时候运行。使用
@AfterThrowing 注解来声明。

4、后通知(After
(finally)
advice):不论切入点匹配的方法是正常结束的,还是抛出异常结束的,在它结束后(finally)后通知(After
(finally) advice)都会运行。使用
@After注解来声明。这个通知必须做好处理正常返回和异常返回两种情况。通常用来释放资源。

5、环绕通知(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框架一样,在运行时完成织入。

织入的方式

1、运行时织入-即在java运行的过程中,使用Java提供代理来实现织入。根据代理产生方式的不同,运行时织入又可以进一步分为J2SE动态代理及动态字节码生成两种方式。由于J2SE动态代理只能代理接口,因此,需要借助于一些动态字节码生成器来实现对类的动态代理。大多数AOP实现都是采用这种运行时织入的方式,包括Spring。

2、类加载器织入-指通过自定义的类加载器,在虚拟机JVM加载字节码的时候进行织入,比如AspectWerkz(已并入AspecJ)及JBoss就使用这种方式。

3、编译器织入-使用专门的编译器来编译包括切面模块在内的整个应用程序,在编译的过程中实现织入,这种织入是功能最强大的。编译器织入的AOP实现一般都是基于语言扩展的方式,即通过对标准java语言进行一些简单的扩展,加入一些专用于处理AOP模块的关键字,定义一套语言规范,通过这套语言规范来开发切面模块,使用自己的编译器来生成java字节码。AspectJ主要就是是使用这种织入方式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: