How to program based on AOP in Spring Framework
Overview
Basic concepts
- Join point
连接点是程序执行过程中某个特定的执行点。这个执行点所进行的对某个方法的调用或是对某个异常的处理。在Spring Framework中连接点就是指对某个程序的调用点。
- Point cut
切入点是匹配连接点的一种结构。切入点表达式与连接点的匹配是实现AOP的技术核心。
- Advice
通知,是指在某个切入点所执行的代码。它应该和某个切入点表达式相连,并在满足切入点的连接点上运行。通知具有多种类型,其中包括around、before和after等类型。
- Aspect
切面,是指对关注点的模块化处理,也就是切入点和通知的结合体,它类似于OOP中定义的一个类,但是它更多代表的是对象间横向的关系。
- Introduction
引入,是指为对象增加额外的方法或者属性,从而达到修改对象内部结构的目的。Spring Framework允许引入新的接口(以及对应的实现)到任何被代理的对象。
- Target Object
目标对象,是指被一个或者多个切面通知的对象,也可以称做被通知对象。因为Spring AOP是在运行时实现代理的,因而这个对象永远是一个被代理对象。
- AOP Proxy
AOP代理,是由AOP框架创建的代码对象,用来实现切面契约(aspect contract)(包括通知方法执行等)。在Spring Framework中,AOP代理可以是JDK动态代理或CGLIB代码。
- Weaving
织入,是指将切面(Aspect)连接到其他应用程序类型或者对象上,并创建一个被通知(Advised)的对象。织入工作可以在编译时(例如使用AspectJ编译器)、类加载时或者运行时完成。Spring和其他纯Java AOP框架一样,是在运行时完成织入工作的。
Features of Spring AOP
Spring AOP是采用纯Java实现的,因此它不需要使用任何特殊的编译器来编译Java对象,也不需要通过控制类装载器来实现对被装载对象的修改。因此,它具有广泛的适用性,可以很方便的应用于各种系统中。
Spring Framework目前仅支持使用方法调用作为连接点,在Srping Bean上通知方法的执行。虽然可以在不影响到Spring AOP核心API的情况下加入对成员变量拦截器的支持。但是Spring并没有实现成员变量拦截器。如果需要把对象成员的访问和更新也作为通知的连接点,可以考虑其他语法的Java语言,如AspectJ。
Spring AOP对通知类型提供了广泛的支持。它所支持的智能类型包括:
- Before advice
前置通知是指在某个连接点方法之前执行的通知。如果这个通知不抛出异常,那么该连接点就一定会被执行。
- After returning advice
返回后通知是指在某个连接点方法正常完成(没有抛出异常)后执行的通知。
- After throwing advice
抛出异常通知是指在连接点抛出异常退出时执行通知。
- After finally advice
后置智能是指无论是在任何情况下连接点方法退出时执行的通知,也就是说无论连接点方法正常退出还是抛出异常退出都会执行此通知。
- Around advice
环绕通知是指包围连接点方法的通知。这种通知的功能非常强大,可以替代前面任何一种通知的功能。
Spring AOP通常都是和Spring IOC容器一起使用的,因而Spring AOP在 实现上更侧重于实现和Spring IOC容器的整合。这也是Spring AOP和其他AOP实现的一个显著区别。
因此,有些事情使用Spring AOP是无法轻松或者高效完成的,例如通知一个细粒度的对象。在这种情况下,使用AspectJ是最好的选择。
Spring默认使用Java SE中的动态代理来作为AOP的代理。这样任何接口都可以被代理。另外,Spring也支持CGLIB代理。
AOP-based configuration
AOP based on @AspectJ
参考文献
- Struts,Hibernate,Spring集成开发宝典 /陈天河等编著;——北京:电子工业出版社,2007.1;ISBN 7-121-03399-2
- Spring实战:第4版 /(美)沃尔斯(Walls,C.)著;张卫滨译。——北京:人民邮件出版社,2016.4 ISBN 978-7-115-41730-5