此前对于AOP的使用仅限于声明式事务,除此以外在实际开发中也没有遇到过与之相关的问题。最近项目中遇到了如下几点需求,仔细思考以后,以为采用AOP 来解决。一方面是为了以更加灵活的方式来解决问题,另外一方面是借此机会深刻学习Spring AOP相关的内容。本文是权当本人的本身AOP学习笔记,如下需求不用AOP确定也能解决,至因而否牵强附会,仁者见仁智者见智。spring
事实上,以上需求没有AOP也能搞定,只是在实现过程当中比较郁闷摆了。express
终于下定决心,采用AOP来解决!代码以下:app
切面类TestAspectide
ApplicationContext模块化
测试类AOPTest函数
运行结果以下:学习
《Spring参考手册》中定义了如下几个AOP的重要概念,结合以上代码分析以下:测试
<aop:config>
的 proxy-target-class
属性设为true通知(Advice)类型spa
切入点表达式代理
modifiers-pattern:方法的操做权限
ret-type-pattern:返回值
declaring-type-pattern:方法所在的包
name-pattern:方法名
parm-pattern:参数名
throws-pattern:异常
其中,除ret-type-pattern和name-pattern以外,其余都是可 选的。上例中,execution(* com.spring.service.*.*(..))表示com.spring.service包下,返回值为任意类型;方法名任意;参数不做限制的 全部方法。
能够经过args来绑定参数,这样就能够在通知(Advice)中访问具体参数了。例如,<aop:aspect>配置以下
TestAspect的doAfter方法中就能够访问msg参数,但这样以来 AService中的barA()和BServiceImpl中的barB()就再也不是链接点,由于execution(* com.spring.service.*.*(String,..))只配置第一个参数为String类型的方法。其中,doAfter方法定义以下:
任何通知(Advice)方法能够将第一个参数定义为 org.aspectj.lang.JoinPoint
类型。JoinPoint
接口提供了一系列有用的方法, 好比 getArgs()
(返回方法参数)、getThis()
(返回代理对象)、getTarget()
(返回目标)、getSignature()
(返回正在被通知的方法相关信息)和 toString()
(打印出正在被通知的方法的有用信息。