博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring5.0版本-AOP-如何实现拦截器链式调用(责任链模式)
阅读量:4599 次
发布时间:2019-06-09

本文共 2021 字,大约阅读时间需要 6 分钟。

CglibAopProxy类第688行:new CglibMethodInvocation(proxy, target, method, args, targetClass, chain, methodProxy).proceed();

参数 chain:拦截器链,保含了目标方法的所有切面方法 ,从chain里面的数组元素的顺序来看,拦截器的顺序before不再after前面执行

 每一个  **Interceptor有一个invoke()方法

Interceptor是一个空接口  MethodInterceptor extends Interceptor  ,以下是Interceptor的继承结构:

public interface Advice {}public interface Interceptor extends Advice {}public interface MethodInterceptor extends Interceptor {            Object invoke(MethodInvocation invocation) throws Throwable;}
Object invoke(MethodInvocation invocation) throws Throwable;方法: 参数 :MethodInvocation 类中有proceed()方法,以下是MethodInvocation的继承结构:
public interface Joinpoint {        Object proceed() throws Throwable;        Object getThis();        AccessibleObject getStaticPart();}public interface Invocation extends Joinpoint {        Object[] getArguments();}public interface MethodInvocation extends Invocation {    Method getMethod();}
View Code
MethodInvocation extends Invocation extends JoinPoint ,proceed()方法时JoinPoint接口声明的 然后ReflectiveMethodInvocation implements ProxyMethodInvocation ,ProxyMethodInvocation extends MethodInvocation
spring的拦截器 xxxInterceptor都实现了自己的 Object invoke(MethodInvocation invocation)方法 ReflectiveMethodInvocation类中的 proceed()方法会遍历拦截器链,调用每个拦截器的invoke方法,传入ReflectiveMethodInvocation自身作为参数, 每个拦截器的invoke方法做两件事(这两件事的执行顺序因拦截器的功能而异):1.执行自己的业务逻辑 2.执行ReflectiveMethodInvocation的proceed():这样就实现了链式调用 这就是责任链模式:    统一的业务接口:Handler接口 中的方法invoke(),即业务方法    责任链相当于一个负责人集合,每一个负责人都实现了自己的invoke()方法来处理传进来的数据或对象或对象的指定方法    如何通知下一个负责人处理业务:       方法1:设计一个责任链执行器,包含责任链集合。责任链执行器中有一个proceed(),方法内遍历执行负责人的invoke()方法,invoke方法以执行器作为参数:             invoke(执行器),invoke(执行器)处理完业务后,执行器又调用proceed()方法,将索引移到下一个负责人位置。             这样:执行器和负责人的方法相互调用,而执行器通过移动索引通知下一个负责人处理业务。       方法2:基于链表的责任链,每一个负责人是一个责任节点Node,包含指向下一个负责人的next引用             负责人的处理业务的方法 invoke()这时不带参数,invoke()方法里面递归调用invoke()方法,并设置出口条件。             如何通知下一个负责人处理业务:invoke()方法:1.处理业务,2.next.invoke(),3.出口条件可以是next!=null

转载于:https://www.cnblogs.com/dengrong/p/10809922.html

你可能感兴趣的文章
js时间转换
查看>>
(转载) Android Studio你不知道的调试技巧
查看>>
POJ2231 Moo Volume 递推 C语言
查看>>
struts2类型转换的具体流程
查看>>
Hdu 1203 I NEED A OFFER!
查看>>
php文件上传类
查看>>
CF219D Choosing Capital for Treeland
查看>>
luogu P3809 【模板】后缀排序
查看>>
Red Gate 破解
查看>>
JVM 调优工具
查看>>
SCTF 2014 pwn题目分析
查看>>
集合以及特殊集合
查看>>
USACO 2.2 Runaround Numbers
查看>>
利用 force index优化sql语句性能
查看>>
Matlab画图-非常具体,非常全面
查看>>
365. Water and Jug Problem
查看>>
SQL数据库数据检索top和distinct
查看>>
平衡搜索树--红黑树 RBTree
查看>>
sqlite驱动下载
查看>>
让IE6/IE7/IE8浏览器支持CSS3属性
查看>>