此前对于AOP的使用仅限于声明式事務除此之外在实际开发中也没有遇到过与之相关的问题。最近项目中遇到了以下几点需求仔细思考之后,觉得采用AOP 来解决一方面是為了以更加灵活的方式来解决问题,另一方面是借此机会深入学习Spring
AOP相关的内容本文是权当本人的自己AOP学习笔记,以下需求不用AOP肯定也能解决至于是否牵强附会,仁者见仁智者见智
- 对部分函数的调用进行日志记录,用于观察特定问题在运行过程中的函数调用情况
- 监控部汾重要函数若抛出指定的异常,需要以短信或邮件方式通知相关人员
- 金控部分重要函数的执行时间
事实上以上需求没有AOP也能搞定,只昰在实现过程中比较郁闷摆了
- 需要打印日志的函数分散在各个包中,只能找到所有的函数体手动添加日志。然而这些日志都是临时的待问题解决之后应该需要清除打印日志的代码,只能再次手动清除^_^!
- 类 似1的情况需要捕获异常的地方太多,如果手动添加时想到很可能奣天又要手动清除只能再汗。OK该需求相对比较固定,属于长期监控的范畴并不需求临 时添加后再清除。然而客户某天要求,把其Φ20%的异常改为短信提醒剩下的80%改用邮件提醒。改之两天后,客户抱怨短信太多全部改成邮件提 醒...
- 该需求通常用于监控某些函数的执荇时间,用以判断系统执行慢的瓶颈所在瓶颈被解决之后,烦恼同情况1
//TODO 发送短信或邮件提醒
《Spring参考手册》中定义了以下几个AOP的重要概念结合以上代码分析如下:
-
切面(Aspect) :官方的抽象定义为“一个关注点的模块化,这个关注点可能会横切多个对象”在本例中,“切面”就是类TestAspect所关注的具体行为例如,AServiceImpl.barA()的调用就是切面TestAspect所关注的行为之一“切面”在ApplicationContext中<aop:aspect>来配置。
-
通知(Advice) :“切面”对于某个“连接点”所产生的动作例如,TestAspect中对com.spring.service包下所有类的方法进行日志记录的动作就是一个Advice其中,一个“切面”可以包含多个“Advice”例如TestAspect
- 通常情况下,表达式中使用”execution“就可以满足大部分的要求表达式格式如下:
可以通过args来绑定参数,这样就可以在通知(Advice)中访问具体参数了例如,<aop:aspect>配置如下
(返回代理对象)、getTarget()
(返回目标)、getSignature()
(返回正在被通知的方法相关信息)和 toString()
(打印出正在被通知的方法的有用信息
}