面向对象编程技术常常通过继承和委托实现代码复用。如果在应用中所有对象都继承自一个基类,这样的继承体系并不稳定;使用委托,则在遇到复杂对象时显得比较笨重。
切面则提供了一个更清楚、更轻量级的选择。利用AOP,你可以将一些通用功能集中在一个模块中,并规定在什么地方什么时候将这些功能应用在业务模块上,而且不需要修改业务模块的代码。把交叉关注点模块化到某个特定的类,这个类就称为切面(aspects),这有两个优点:
关注点分离,而不是与业务逻辑代码混合在一起;
业务模块更加清晰,因为它们只需要关注业务逻辑部分;
在AOP术语体系中,切面真正要做的工作称之为通知(advice)。
通知负责定义切面的what和when——即这个切面负责什么工作,以及何时执行这个工作。应该在方法调用前执行切面的任务?还是在方法调用后执行切面的任务?还是应该在方法调用之前和之后都执行切面的任务?还是仅仅在方法调用抛出异常时执行切面的任务?
Spring切面支持以下五种通知:
Before——前置通知,在调用目标方法之前执行通知定义的任务;
After——后置通知,在目标方法执行结束后,无论执行结果如何都执行通知定义的任务;
After-returning——后置通知,在目标方法执行结束后,如果执行成功,则执行通知定义的任务;
After-throwing——异常通知,如果目标方法执行过程中抛出异常,则执行通知定义的任务;
Around——环绕通知,在目标方法执行前和执行后,都需要执行通知定义的任务。
如果说通知是定义了切面的what和when这两个方面,那么切点就定义了where。切点指定一个或者多个织入点,而通知可以通过切点接入。通常情况下可以使用明确的类名和函数名或者定义了匹配模式的正则表达式来定义切点;还有一些AOP框架支持定义动态切点(dynamic pointcuts),可以在运行时根据函数参数值决定是否应用通知。
通知和切点合起来就构成了切面——what、when和where。
编织是将切面应用于目标对象的过程.在应用程序执行过程中将切面织入到目标对象中。一般而言,AOP容器会动态生成目标对象的代理,然后将切面织入到应用的执行过程。Spring AOP是这么做的。
Spring对AOP的支持来自以下几种形式:
基于动态代理的切面
POJO 切面
基于@AspectJ注解的切面
Spring AOP基于动态代理机制构建,也正是因为这个原因,Spring AOP仅仅支持函数调用级别的拦截。
微信公众号: java技术
技术交流群: 245130488
java就业方向从零自学视频教程
百度传课:http://www.chuanke.com/s3377987.html
QQ课堂:https://bumishi.ke.qq.com
网友评论