JFinal 3.3 发布,天下武功,唯快不破

来源: 投稿
作者: JFinal
2017-11-22

多年前看过周星驰的电影《功夫》,里头的大 Boss 火云邪神有一句经典台词:天下武功,无坚不破,唯快不破。

周星驰最后通过变得比火云邪神更快,轻松击败火云邪神

在当时我对这句 “天下武功,无坚不破,唯快不破” 并不以为然,直到 2016 年,jfinal 社区有位小伙伴用 jfinal 做了一个电影网站《憨憨电影》,传送门 。看了里面的《闪电侠》这部美国科幻剧,传送门 ,才意识到唯快不破的深刻内涵,闪电侠本质就一个核心能力:“快”。运动速度可以自我调整到无比之快。就 “快” 这么一个特性,组合达成无数强大的功能。

例如,围绕飓风做反方向圆周运动,制造反作用力轻松化解飓风

例如,快速奔跑与空气摩擦制造闪电并发射出去,击败 Sand Demon

当然,还可以用“快”实现撩妹功能,撩到的还是美艳的女超人

一个 “快” 字,让原本棘手的问题得以巧妙化解,使得闪电侠战无不胜

科幻归科幻,回到现实中,那么到底这个 “唯快不破” 有没有没道理呢?在 jfinal 这些年的实战中被证实确有道理,例如 jfinal 在 6 年前率先使用 JFinal.start(...) 的方式秒起项目,不用配置 tomcat/jetty,修改源代码不用重启项目,本质就是 “快”,以至于几年以后发布的 spring boot 也用了这一招来启动项目

再例如 jfinal 完全消灭掉 xml 配置,独创 API 引导式配置,开发者在开发时除了不再被 xml 噪音干扰以外,还可以不用去记忆各种繁杂的配置,API 引导式配置不但可以利用 IDE 的代码提示而且还可以通过参数名、注释内容立即了解配置的含义。本质还是 “快”,以至于几年以后才发布的 spring boot 也去除 xml 并引入了与 jf API 引导式配置相似的设计 java config

再例如,jfinal 极大提升开发效率,往往在他人还在写配置文件的时候,jfinal 小伙伴们已然实现了功能产品可以快速上线,更早获取用户对产品的反馈,极大提升了产品迭代速度,这在如今分秒必争高速发展的互联网时代是创业成功的关键。如果产品的进化速度无比快,将是不可战胜的

以往 jfinal 的快,更多体现的是上手快、启动快、开发快、学习快、扩展快。那么这次 jfinal 3.3 关注一下运行起来的性能快不快? 以下是 jfinal 与 spring + mybatis 性能测试结果


jfinal 性能是 spring + mybatis 的 4.56 倍,这里是测试项目链接:https://gitee.com/jfinal/jfinal-performance

以下是 jfinal 模板引擎与 freemarker、velocity 性能测试结果

jfinal 模板引擎性能是 freemarker 的 4.27 倍,是 velocity 的 3.42,不仅速度快而且内存占用更小,这里是测试项目链接:https://gitee.com/jfinal/enjoy-performance

jfinal 3.3 对模板引擎做了十分细致的性能优化,性能大幅提升,jf 3.3 对模板引擎主要采用了如下优化方法:

  1. 采用 "笼罩" 式设计,引入 WriterBuffer 覆盖于入参 Writer、OutputStream 之上,使用内部的 byte[] buffer、char[] buffer、DateFormat 尽可能避免内存分配

  2. ExprList、StatList 避免在单一内部对象时 for 循环

  3. 添加 byte 模式,使得模板静态内容只 encode 一次

  4. fnv 64 算法代替 StingBuider 拼接字符串生成 hash

  5. 优化 Integer、Double、Float、Boolean 等类型数据输出

  6. 优化日期类型格式化,回收利用 SimpleDataFormat

除了模板引擎性能上的大幅提升以外,jfinal 3.3 还进行了将近 50 项增强与改进

1:模板引擎添加 byte 输出模式

template.render(data, request.getOutputStream());

该模式最大的好处是,在 web 环境下直接输出 byte 流,避免对模板文件中的静态文本部分做 encode 操作,性能可提升一到两倍

2:添加 ControllerFactory,支持用户接管 controller 生命周期

me.setControllerFactory(new FastControllerFactory());

不仅可以控制 controller 生命周期、重复回收利用 controller 对象,还可以方便进行 IOC、DI 动作

3:增强 PropKit、Prop,添加 append 系列方法

PropKit.use("dev.txt").append("prod.txt");

大多数情况下开发环境与生产环境配置文件的配置项都相同,引入 append 方法,可以让 prod.txt 配置文件中仅添加与 dev.txt 中不同的配置项,例如 password,极大减少配置工作量,也减少了出错的可能性,感谢 @t-io 作者提出的好建议

4:添加 #number 指令,支持格式化输出数值数据

#number(3.1415926, "#.##")
#number(0.9518, "#.##%")
#number(300000, "光速为每秒 ,### 公里。")

5:Model、BaseModel、MappingKit 改由模板引擎实现

public class #(mappingKitClassName) {
 public static void mapping(ActiveRecordPlugin arp) {
  #for (tableMeta : tableMetas)
   arp.addMapping("#(tableMeta.name)", "#(tableMeta.primaryKey)", #(tableMeta.modelName).class);
  #end
 }
}

由字符串拼接改由模板引擎实现以后,不仅便于可读性与维护性,而且十分有利于自由定制个性化模板

6:支持自定义 ActionHandler,彻底接管 action 请求

me.setActionHandler(new MyActionHandler());

7:Controller.renderToString(...) 支持 viewPath

renderToString("reply_item.html");

老版本中要使用全路径,新版本更省代码,viewPath 规则与其它 render 方法完全一致,不增加学习成本,全路径使用方式也天然兼容。

jfinal 3.3 版本如上的增强与改进还有很多,为限制篇幅,在此不在赘述,后续会单独补充详细的 jfinal-3.3-changelog.txt

ONE MORE THING:俱乐部将直播 jfinal 3.3 的各种性能优化技术,优化所使用的工具、优化的方法与过程,对此感兴趣的同学可加入俱乐部:http://jfinal.com/club

展开阅读全文
66 收藏
分享
加载中
精彩评论
隔壁的 Jboot 1.0 正式版也发布啦,依赖JFinal最新版本3.3 ... https://www.oschina.net/news/90816/jboot-1-0
2017-11-22 16:56
20
举报
Eova武汉简码科技有限公司

引用来自“TerryZ”的评论

咦,看来Spring Boot是抄袭JFinal的了!

引用来自“JFinal”的评论

这个肯定不是,只是部分设计在理念上相似,不同的人在不同的时间点产生相同的相法是并不罕见,不过有一点可以肯定,去除 xml、采用 api 引导式 config 这个 jfinal 比 spring boot 早很多年
抄袭设计理念这种事没法证明,只能说明有很大嫌疑,跑在后面的都有嫌疑.
不过以Spring的能量肯定不会低端到抄袭代码.
但是我敢肯定这颗星球上,代码的经济适用性能超越JFinal的还真没几个.
最恶心的一群人是,之前一直推崇Spring,整一堆xml配置,各种Bean各种注入,还乐此不疲.
当SpringBoot出来的时候一个个又屁颠屁颠的开始舔SB.
却忘了自己当初的思想,和言论,各种配置大法好.
Spring把EJB整死了,坐等Spring死球子,早晚的事.
2017-11-23 01:31
12
举报
Eova武汉简码科技有限公司
天下武功,唯快不破
2017-11-22 17:05
9
举报
两年前掉到JFinal这个坑里以后,就不愿意出来了。极速,极简,一把Java开发的瑞士军刀。能让开发者把精力都集中在业务逻辑,无视框架的存在。感谢作者开源这么好的作品。
2017-11-22 17:08
5
举报
jfinal redis插件什么时候支持哨兵模式?
2017-11-22 16:33
3
举报
最新评论 (138)
不错,简单易用
2018-05-14 19:40
0
回复
举报
struts2.0的时代到了 spring mvc的时代过去了。
2018-01-03 11:27
0
回复
举报

引用来自“蔫老虎”的评论

两年前掉到JFinal这个坑里以后,就不愿意出来了。极速,极简,一把Java开发的瑞士军刀。能让开发者把精力都集中在业务逻辑,无视框架的存在。感谢作者开源这么好的作品。
对前端的css,js开发有没有变化?
2017-11-27 13:27
0
回复
举报

引用来自“德莫罗”的评论

@JFinal
是否考虑过支持微服务模式?感觉最典型的应用场景还是单体应用,如果在微服务模式下,注册发现,安全,熔断,统一配置中心这些是否能提供支持或者解决方案。
回复@德莫罗 : https://gitee.com/fuhai/jboot 看看这个
2017-11-26 20:57
0
回复
举报

引用来自“fengxingzhe”的评论

刚有个回复找不到了. 说动态语言重构性不好... php python 真的不熟. 不知道重构好不好.
但重构性在我的经验里. 与语言无关 .. clojure的项目 我一直在不断重构. java的也是重构不断 从 Struts spring hibernate guzz mybaties .... 其实一直不愿说哪个语言好,哪个不好. 我用java12年多. 转到clojure 3年多点. 最近之所以 宣传, 是因为不想太自私. 这个东西,真的有他的好, 你完全可以 java clojure 并用. clojure 只是真的会提高你一下.
动态语言重构困难是因为弱类型,类型边界模糊
2017-11-24 20:42
0
回复
举报
天下武功,唯快不破------古龙
2017-11-24 16:50
0
回复
举报
jfinal这个框架,认知它有 3年了,一次都没用过;下个项目 试试 3.3版本的
2017-11-24 16:31
0
回复
举报
“下个项目”,是下一个(next)项目呢,还是下载(download)一个项目?
哈哈哈哈
2019-10-24 10:14
0
回复
举报

引用来自“easymbol”的评论

确实简化了许多开发过程,jfinal3.1开始上车,第二个项目采用jfinal3.2 结果...第二个项目还未开发完...jfinal3.3的都出来了,速度太溜

引用来自“JFinal”的评论

jfinal 3.2 升级到 jfinal 3.3,秒秒钟的事,但获得的好处是超值的

引用来自“fengxingzhe”的评论

https://github.com/ring-clojure/ring 看这些年你一直坚持jfinal,精神可嘉 ,但java的本质限制了你的发展. 看下这个项目. 会拓宽你的思路. 如果java比做拖拉机 ,那clojure就几乎是法拉利.

引用来自“JFinal”的评论

已 fork 该项目,如果里头有可以拓宽认知的思路,一定会用到后续的 jfinal 版本之中。

jfinal 部分思想吸收过 ruby、python 语言,及其之下框架的优点。jfinal 一直在拓展认知边界
❤❤
2017-11-24 16:06
0
回复
举报

引用来自“easymbol”的评论

确实简化了许多开发过程,jfinal3.1开始上车,第二个项目采用jfinal3.2 结果...第二个项目还未开发完...jfinal3.3的都出来了,速度太溜

引用来自“JFinal”的评论

jfinal 3.2 升级到 jfinal 3.3,秒秒钟的事,但获得的好处是超值的

引用来自“fengxingzhe”的评论

https://github.com/ring-clojure/ring 看这些年你一直坚持jfinal,精神可嘉 ,但java的本质限制了你的发展. 看下这个项目. 会拓宽你的思路. 如果java比做拖拉机 ,那clojure就几乎是法拉利.

引用来自“下里巴人_770728”的评论

这个对比恐怕不太恰当。根据我用clojure系和java的经验,java虽然臃肿,但有IDE的加持,真实写代码的效率比clojure差不了多少。clojure最大好处是不变式为主,容易理解。最大坏处是没有编译期类型检查,写东西全靠记忆,是否正确全靠单元测试+跑程序,完全没有写java时通过编译代码就正确的那种爽快感。(所以,我的意思是:clojure不适合记忆力象我一样差、又无法保证一次写正确的弱手😁)
cursive https://cursive-ide.com/
https://segmentfault.com/a/1190000000696419 不说话. you just to kan
2017-11-24 15:58
0
回复
举报

引用来自“颖辉小居”的评论

我比较关心,这个问题还存在吗?https://www.oschina.net/question/2507499_2244106
这个问题一直都不存在,就是一个日期输出格式设置问题:
JsonManager.me().setDefaultDatePattern("yyyy-MM-dd HH🇲🇲ss")

日期型数据只要先确保时分秒确实存在,剩下的就是一个 pattern 配置的事
2017-11-24 15:26
0
回复
举报
更多评论
152 评论
66 收藏
分享
返回顶部
顶部