JFinal 4.9.03 发布,添加路由扫描功能

    JFinal 4.9.03 主要新增了路由扫描功能,开发更快更方便。

    以往未添加路由扫描功能主要有如下原因:

    一是未找到支持 routes 级别拦截器以及 baseViewPath 配置的设计方案。

    二是未找到支持拆分路由的方案。

    三是性能损失降低开发体验,热加载启动速度慢。

    四是有一定的安全隐患。

    本次 jfinal 4.9.03 所使用的方案解决了上述所有问题,找到了最优解。

    新功能在周末开发完成,已经推送至 maven 中心库,现在就可以使用了。

    jfinal 官网已经将 jfinal-club、jfinal-blog、weixin-pay、jfinal-demo 等等下载资源全部改成了路由扫描用法,欢迎你来社区网站下载使用。

    路由扫描功能使用极其简单,首先是在 Controller 之上添加 @Path 注解配置 controllerPath:  

@Path("/club")
public class ClubController extends Controller {
   ......
}

    然后在 configRoute 中开启扫描:

public void configRoute(Routes me) {
    me.addInterceptor(...);
    me.setBaseViewPath(...);
    
    // 开启路由扫描
    me.scan("com.club.");
}

     如上代码所示,routes 级别拦截器以及 baseViewPath 配置功能依然被支持,路由拆分功能见 jfinal 官方文档。   

    最后,借此新版本发布与双十一来临之际,介绍一下 jfinal 俱乐部。

    jfinal 俱乐部成立于 2017 年,目的是尝试提供增值服务获取一定资金用于 jfinal 可持续发展。

    目前俱乐部会员接近 2000 人,俱乐部专享 QQ 群人数已超过 1700 人。

    俱乐部除了提供主打资源以外,还会不定期提供设计、分享、源码等视频资源下载,部分资源下载列表详见https://jfinal.com/my/club

    近期发布了一批同学们关心的技术视频,例如《enjoy设计-算法-源代码.mp4》、《jfinal-route-scan.mp4》等等。

    想学习如何开发一门语言或如何手写一个模板引擎的同学可以关注一下上述视频。

    enjoy 视频介绍了词法、语法分析中独创的 DLRD、DKFF 算法。

    俱乐部下一个重磅级专享福利项目 jfinal-admin 正在快速开发之中,很快将上线。

    该项目是一个通用的前后端开发框架,目的是实现前端后端同时极速开发。

    该项目提供了现成的内容管理、权限管理、账户管理、文件管理、图片管理等等通用功能。

    在此基础之上提供一套常用的UI 组件,用于快速搞定各类个性化 UI 开发需求。

    明天就是双十一了,这次 jfinal 俱乐部第一次尝试做一次双十一的优惠活动。

    从现在开始加入、充值、续费俱乐部会员扫码立减 ¥60 元

    在双十一买买买的时候,别忘了给自己投资一点点到 jfinal 俱乐部,回报一定是超值的 ! 

     双十一优惠传送门:https://jfinal.com/my/club


评论区

天晴

2020-11-10 15:15

有办法做到动态扫描吗?

JFinal

2020-11-10 16:06

@天晴 现在就是动态扫描的

天晴

2020-11-10 16:27

@JFinal 系统运行过程中上传新的包上去不需要重启也能自动添加到路由里去了吗?如果将包移除了呢》

琴海森林

2020-11-10 17:00

波总可以考虑把model和表的映射关系也开启扫描模式配置

JFinal

2020-11-10 17:00

@天晴 这个只在开发环境下支持,生产环境不支持

java 是静态语言,要做到你说的需求很不容易,多年以前阿里就做过这样的尝试,最后失败了

JFinal

2020-11-10 17:02

@琴海森林 你这么一说,倒真是可以的,主要是因为现在的扫描方案性能极高

不过现在已经了自动生成功能,再扫描的话必要性就低了

要知道 Model 的自动生成功能有一个重要的点就是生成 baseModel, 这个可以快速响应数据库的变动

只要是生成 baseModel 的需求存在, 那么顺便生成一下 model 与 tabel 的映射也就可以了

琴海森林

2020-11-10 17:07

@JFinal 是的,我是拿你的代码过来改了一下,但是是在应用层的改造,用起来不完美,所以希望官方提供这个功能

JFinal

2020-11-10 17:08

@琴海森林 用上官方的 PathScanner, 改造一下你的扫描代码就可以了,很方便的

JFinal

2020-11-10 17:09

PathScanner 是极简设计,一共才 177 行代码:
https://gitee.com/jfinal/jfinal/blob/master/src/main/java/com/jfinal/core/PathScanner.java

琴海森林

2020-11-10 17:10

@JFinal 我现在就是用到这个类的代码,写了一个TableScanner,比我之前那个扫描好用太多了

北流家园网

2020-11-10 21:35

@JFinal 增加这个功能,我还没有感觉到有什么好处。我是想问,前台看到一个路由,如何快速找到入口?对应的是哪个Controller?我需要翻遍所有的Ctrotroller吗?或者靠运气一眼就能找到?

qsyan

2020-11-10 21:54

说你造轮子,居然删我贴。

JFinal

2020-11-10 22:00

@qsyan 应该是小编误点了,抱歉

有关是不是造轮子的事情,还请说得更详细一些

有时候确实是造轮子,有时候造的轮子会更好用

jfinal 的功能十分丰富,但代码量只有 3 万行,比 spring 少了十倍不止,如果如你所说是造轮子,应该也是一个更轻量更简单的轮子,有很多人还是很喜欢这样的轮子的

qsyan

2020-11-10 22:04

@JFinal 给你个建议,感觉你的路线现在走的有点偏了,当初为了脱离spring的,现在又在效仿spring(国内框架大多都是这样,不想用spring,但是不得不效仿其设计模式),这样一来,jfinal就失去了他本有特点。

JFinal

2020-11-10 22:11

@qsyan 如果你真的仔细看过 jfinal 源代码,你就会知道 jfinal 与 spring 完全是两个世界,完全是两种不同的设计

再告诉你一个事实, jfinal 是 2011 年就存在的,开源是在 2012 年 3 月 18 日,这里有记录:
https://www.oschina.net/p/jfinal

而 spring boot 是 2014 年左右才出生,也就是说 jfinal 比 spring boot 早出生将近 3 年,jfinal 顶层设计 10 年不变

从这个出生的时间先后次序,你应该可以接受 jfinal 并不是 spring boot 的轮子。 倒是 spring boot 很多用法跟 jfinal 早期的设计很像

例如抛弃 xml, 简化配置, 约定大于配置, 谁是轮子,相信你有个新的认知

JFinal

2020-11-10 22:13

@qsyan 我觉得你今天看到 jfinal 也有路由扫描,仅从这一个功能特性就认定是轮子,这个显然是不全面的

因为,所有的 web orm aop 框架,不可能没有一点儿相似的地方,我强调,是所有的这类框架

山东小木

2020-11-10 22:30

汽车有汽车的轮子 飞机有飞机的轮子 造符合自己的轮子 应该的@qsyan

jiaxiang

2020-11-11 09:27

期待jfinal-admin和iot

琴海森林

2020-11-11 09:47

@北流家园网 那就是你的系统设计问题了,这个你可以看JFinal-layui的路由设计,

就是能根据路由一眼就找到controller,html,已将原有的路由扫描替换为JFinal的路

由扫描了,平滑升级,解决了原有路由扫描存在的一些问题,很香,给波总点赞

yxkuser

2020-11-11 11:29

@Jfinal,@all,我感觉是纯技术上的分歧,懂的人肯定懂,不懂的人肯定不会懂,我好像觉得qsyan的意思应该是想表达路由扫描又回到spring的设计模式上了,说实话我目前也还是没有理解这个路由扫描能带来哪些便捷,如果这样写的话,反尔系统维护起来有点晕,可以按原来的写法写,又可以按扫描写,有点凌乱,总体我觉得波哥应该是想照顾从spring过来的人,05年从事开发15年的老程序员,不知道说的对不?

yxkuser

2020-11-11 11:38

天下武功唯快不破,快我觉得这是jfinal的特点,所以后期的功能迭代在大而全上波哥也不太好下决定,我提意波哥迭代新功能前稍稍透漏点消息,也好集思广义

JFinal

2020-11-11 12:03

@北流家园网 这个功能主要能进一步提升开发效率,具体来说就是你在新建一个 Controller 的时候,省去了打开 Routes、添加 controller 注册这两个动作

当然,凡事 兴一利必生一弊,你说的这个根据路由快速找到 controller 的问题当然是存在的

所以,这个扫描功能相当于一个外挂性扩展,喜欢的同学可以用,不喜欢的可以沿用原来的用法

我自己试用的结果是正面的,体验很好。我个人建议你试用一下。 你提到的根据路由快速找到 controller 的问题确实存在,但有两点信息可以关注一下:
1:拿到一个 url 例如 "/club/join" ,其实可以使用搜索功能,搜索 @Path("/club 定位

2:我个人的开发实践表明,其实我很少在得到一个 url 以后通过查找 Routes 中的注册信息去定位 controller 。 因为一般来说路由使用的就是 controller 命名时的前缀,例如看到 "/club/join" 我会猜测对应的控制器是 ClubController

希望你在试用后能跟我反馈一下,体验是好是坏,我需要得到反馈,这样便于进一步迭代提升

JFinal

2020-11-11 12:04

@琴海森林 jfinal 官方出品的,必定是极高品质的设计,极高品质的代码实现,测试了 windows、mac os、linux,这样交付给你的才是一个值得信任的作品

选择 jfinal ,没错的

JFinal

2020-11-11 12:06

@yxkuser 其实还是为了提升开发效率,因为扫描可以在新建 controller 时不用打开 Routes,不用添加映射代码。 开发体验更好一些

当然,凡事 兴一利必生一弊,一切都是权衡后的选择。 你说的照顾 spring boot 用户绝对是很硬的理由,也确实是我考虑的一个方面

杜福忠

2020-11-11 18:00

我们后来开发的功能为了搜索方便,也是把路径直接写在了方法注释上面,方便搜索定位代码,确实很少从Routes定位代码