Spring aop 实现主要分为:
- 经典的Spring aop
- 纯pojo的
- aspectj (aop)注解
- 基于 aspectj实现的
1、经典的Spring aop实现
1.1、被代理的目标接口类极其实现。
1.2、通知(增强处理)类
1.3、代理类
1.4、xml配置:
测试:
2、使用组件之间的连接配置。(POJO)
2.1、目标类(不是接口)
2.2、通知(增强)类
2.3 xml配置
切点表达式:
execution表达式解释
execution(* com.wangning.aspect..*.*(..))
符号 |
含义 |
execution() |
表达式的主体; |
第一个”*“符号 |
表示返回值的类型任意; |
com.wangning.aspect |
AOP所切的服务的包名,即,我们的业务部分 |
包名后面的”..“ |
表示当前包及子包 |
第二个”*“ |
表示类名,*即所有类。此处可以自定义,下文有举例 |
.*(..) |
表示任何方法名,括号表示参数,两个点表示任何参数类型 |
方法执行之后(返回值 或者 异常)
修改目标类
通知类 添加方法
xml 配置
测试(同上)
1.成功时
2.抛出异常时
AspectJ 切点表达式
AspectJ 指示器 |
描述 |
arg() |
限制连接点匹配参数未指定类型的执行方法 |
@args() |
限制连接点匹配参数为指定注解标注的执行方法 |
execution |
用于匹配是执行方法 |
this() |
限制连接点匹配AOP代理的bean引用为指定类型的类 |
target |
限制连接点匹配目标对象为指定类型的类 |
@target() |
限制连接点匹配特定的执行对象,这些对象对应的类要具有指定类型的注解 |
aop 处理 传进来的参数,处理返回值
args():1、限制拦截方法 2、通过参数名把核心方法参数值传入通知中 args-name="通知方法的参数名"
当args和args-name一起使用的时候,方法表达式的参数类型可以不写
如果args单独使用的时候 方法表达式的参数类型要写
exection(* *.addCourse(参数名)and(&&) args(通知方法里面的参数名))
exection(* *.addCourse(String)and(&&) args(通知方法里面的参数名))
拦截所有pubilc 修饰的方法:exection(public *.addCourse(..) )
拦截方法的参数类型取决于通知方法里面的参数类型
exection(* *.addCourse(参数名)and(&&) args(通知方法里面的参数名) and args-name = “通知方法里面的参数名,参数名”)