Struts 2 拦截器底层实现原理 学习笔记
拦截器:
1、首先要有一个目标对象,要拦截谁
2、拦截对象,拦截器本身只是一个普通的类
3、对目标对象所生成的一个代理对象,真正去执行的是代理对象,代理对象也是有若干个方法
由系统动态产生出来的,并不是我们去写出来的,代理对象的方法与目标对象的方法很类似,但是
代理对象的方法是综合了拦截器的方法和跟你的系统的目标对象的方法,将其综合起来,就形成了代
理对象的方法,也就是说代理方法是拦截器方法与目标对象方法的一个结合体
?
示例:
新增一个类Target.java? 就是我们的目标对象,在使用目标对象之前要有一个接口,要求我们向对接口
编程,即先生成一个接口TargetInterface,并生成一个方法,此接口是一个普通的接口;Target类实现
TargetInterface接口,在此Target就是目标对象,我们要拦截它Target
目标有了,现在就是要写个拦截器对象:Interceptor.java? 在拦截器里面我们定义两个方法:before()、
after();其拦截器跟我们平时看到的类没有什么太大的区别,之所以叫拦截器是其行为而言的;
java对象的动态代理是要用到反射;生成一个处理器类MyHandler实现反射接口InvocationHandler
其作用是将要处理的对象注入到这个处理器类里面来,动态的来调用。
在MyHandler中方法invoke()方法是真正去调用的方法。
再生成一个代理类MyProxy作用是产生一个代理,方法以getProxy()? 得到一个代理,在此要用到
Proxy类,通过newProxyInstance,new一个代理出来;
?
理清的关系:
Target是目标对象,是目标,代理谁
Interceptor是拦截器,将方法动态的插入到目标对象Target方法之前或是之后去执行
在些Target与Interceptor互相不知道,Target不知道被谁插入,Interceptor也不知道插入到哪里。
因此在这声明一个MyHandler处理器,真正去调用目标对象方法,调用目标对象方法之前,执行拦截器的before
(),调用目标对象方法之后执行拦截器的after();
还有一个最重要的代理对象MyProxy,有一个getProxy()方法,传过来目标对象,在此将目标对象set到处理器里
面去myHandler.setObject(object);然后返回一个代理实例,通过代理实例来调用目标对象的方法,目标对象方
法执行之后就会去调用拦截器,则相当于拦截器对其拦截了。
总结拦截器:
角色:
1、被拦截的对象或目标,目标对象的方法被拦截
2、拦截器本身,普通的class类,行为上来说起到了拦截别人的作用
3、代理,通过代理生成对目标对象的一个代理,执行的不是目标对象,而是代理,在代理中已经插入了拦截器
,这样的作用是降低偶合
目标对象与拦截器本身是互不关联的,低偶合,通过myHandler/myporxy来偶合,在struts2中是通过xml配置文件
来偶合的.代码程次是不偶合的.
?
拦截器底层实现就是动态代理实现的。