invoke的实现机制

外婆菜肉沫 发布于 2015/01/23 08:43
阅读 225
收藏 0

@JFinal 你好波总,想跟你请教个问题:jFinal在ActionInvocation.java里面有的invoke方法,有这么一句话action.getMethod().invoke(controller, NULL_ARGS),我一直在看这话,一直搞不清楚,这个invoke是怎么找到controller里面指定的方法去执行的?就比如method里面有一个name属性,值为“index”,那么invoke是怎么找到该controller里面的index方法去执行的?在网上找了好多关于invoke的资料来看,也没看明白,在此只能劳烦波总解释解释了。

加载中
1
JFinal
JFinal

    关键在于 com.jfinal.core.Action 这个类,每一个 Action 对象保存着某一个 Controller 中的某一个 Method 对象,该 Controller 的 Method 称之为一个 action,是 jfinal 请求调用的最小单元。

    为了达到极致性能,该 Action 对象是在系统启动时初始化的,具体看一下 com.jfinal.core.ActionMapping.buildActionMapping() 方法中的源码,在该方法中Controller中的 Method 对象已被获取并存放在了 Action 对象之中,在后续不断的 http 请求中,再也不会动态创建 Action 对象,以及相关的拦截器,让性能达到极致。

    另外,有很多人不理解 ActionInvocation 与 Interceptor 的联合工作方式,她们两者是一个递归调用,只不过递归类型是间接递归,ActionInvocation 调用 Interceptor.interceptor(),而 Interceptor 调用 ActionInvocation.invoke(),这样就形成了一个间接的自己调用自己的链条,该递归的终止条件是拦截器全部被调用完毕。

外婆菜肉沫
外婆菜肉沫
谢谢波总。。。我再仔细了解一下。
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部