actionKey重复时的生效问题

zhl0635 发布于 2015/02/02 23:04
阅读 678
收藏 0

@JFinal 你好,想跟你请教个问题:

最近在看JFinal的源码,有个疑问,在我的DemoConfig里添加了两个controller,如下:

public void configRoute(Routes me) {
    me.add("/hello/test1", HelloController1.class);
    me.add("/hello/test2", HelloController2.class);
}

HelloController1中有个方法method1使用了actionKey注解@ActionKey("/hello/test"),HelloController2中有个方法method2也同样使用了actionKey注解@ActionKey("/hello/test"),我的疑惑是哪一个会生效?

一开始我理解的是会根据me.add的先后顺序有关,看源码的时候发现所有的路由规则会存在Routes类里边的的一个hashMap中

private final Map<String, Class<? extends Controller>> map = new HashMap<String, Class<? extends Controller>>();

在ActionMapping的buildActionMapping()方法中,会

for (Entry<String, Class<? extends Controller>> entry : routes.getEntrySet())

循环遍历所有添加的的controller,然后遍历每个controller的method来构造action,但是存放controller的map是hashMap,遍历它的时候顺序是无序的,所以我自定义的HelloController1和HelloController2哪个先被初始化是不确定的,这也让我由一开始的那个actionKey相同时,哪个会生效的疑问,不知道我的问题描述的清楚不清楚

加载中
0
JFinal
JFinal

    这是一个好问题,对于 Routes.add(controllerKey, controllerClass) 方法来说,程序中有判断是不允许 controllerKey 被重复使用的,会抛出异常。

    但上面的判断仍然不能避免 actionKey 可能出现重复,这种重复不仅可能出现在使用 @ActionKey 的时候,还可能出现在 controllerKey + methodName +urlPara 组合过程中的重复,为此 ActionMapping 中有相关代码只是在重复时做了一个警告,并没有抛出异常。

    对于出现重复以后,哪个会生效,首先是优先 methodName 为 index的,而对于 ActionKey 这种方式造成的非 index 方法,的确是以对 HashMap 迭代时谁先出现谁优先, jfinal 考虑下一版本更加严格,在此直接抛出异常。

    后续补充: jfinal 2.0 已经将规则改成如果有重复 actionKey 直接抛出异常终止启动过程,避免产生疑问。

0
zhl0635
zhl0635

引用来自“JFinal”的评论

    这是一个好问题,对于 Routes.add(controllerKey, controllerClass) 方法来说,程序中有判断是不允许 controllerKey 被重复使用的,会抛出异常。

    但上面的判断仍然不能避免 actionKey 可能出现重复,这种重复不仅可能出现在使用 @ActionKey 的时候,还可能出现在 controllerKey + methodName +urlPara 组合过程中的重复,为此 ActionMapping 中有相关代码只是在重复时做了一个警告,并没有抛出异常。

    对于出现重复以后,哪个会生效,首先是优先 methodName 为 index的,而对于 ActionKey 这种方式造成的非 index 方法,的确是以对 HashMap 迭代时谁先出现谁优先, jfinal 考虑下一版本更加严格,在此直接抛出异常。

赞回复速度

看buildActionMapping()这个方法时,如果method name是“index”,就put到map里,然后返回值如果不是null就warning,一开始还没理解,查了一下帮助文档才知道,map.put()是有返回值的,返回原来的值,又学了一招,赞

最近项目想要迁移,打算使用一个简洁的框架,领导让我调研一下,看到jfinal是osc开源排行第一,就看了一下源码,很赞,能满足绝大部分需求,加油~

zhl0635
zhl0635
赞,看源码获益良多
JFinal
JFinal
index方法时直接put,再判断返回值是否为null的方式是为了提升性能,路由的初始化是在系统启动时一次性完成的。尽可能让执行的代码最少化是jfinal追求性能的方法之一,还有类似于尽可能少地new出对象也是方法之一。jfinal 因为大家的不断反馈在不断变得更好,感谢支持 JFinal 发展 ^_^
返回顶部
顶部