还记得我们第03节的Controller的初始化过程吗?
Jfinal类1
2
3
4
5
6
7
8private void initActionMapping() {
// 从配置文件获取路由 初始化actionMapping
this.actionMapping = new ActionMapping(Config.getRoutes());
// 把路由分别拆分成action映射(利用反射)。 这就完成了路径到controller方法的映射
// 这一步同时完成了action的初始化
this.actionMapping.buildActionMapping();
Config.getRoutes().clear();
}
1 | protected void buildActionMapping() { |
具体看下Inteceptor init 流程
- config file: me.add(new AuthInterceptor());默认添加全局拦截器
- InterceptorManager 类里面维护globalActionInters数组
- 初始化Action时会调用InterceptorManager类的doBuild(),此时全局的拦截器就绑定在action的interceptors数组里
- ActionHandler类:(new Invocation(action, controller)).invoke();调用目标方法时就会按顺序调用 this.inters[this.index++].intercept(this);
总结一下:
Handler和Inteceptor区别?
Handler会拦截所有的web请求,是一个处理链的结构,链的结尾就是ActionHandler
全局Inteceptor绑定在每一个Controller中的每一个方法(action)上,每个action都会维护一个拦截器数据。会不会比较耗内存呢。
启示:
所以全局的操作最好定义handler,局部的操作定义inteceptor。减少对内存的消耗。
补充:(这里是否能这么做还是一个疑问,因为Handler会拦截所有的web请求,包括静态资源)。