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

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

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

引用来自“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
举报
天下武功,唯快不破
2017-11-22 17:05
9
举报
两年前掉到JFinal这个坑里以后,就不愿意出来了。极速,极简,一把Java开发的瑞士军刀。能让开发者把精力都集中在业务逻辑,无视框架的存在。感谢作者开源这么好的作品。
2017-11-22 17:08
5
举报
jfinal redis插件什么时候支持哨兵模式?
2017-11-22 16:33
3
举报
最新评论 (152)
不错,简单易用
2018-05-14 19:40
0
回复
举报
不管出个啥绝壁都会有一大波喷子。
2018-01-26 17:13
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
回复
举报
威武,支持波总,,,,,那谁谁XDB滚犊子
2017-11-24 21:01
0
回复
举报

引用来自“fengxingzhe”的评论

刚有个回复找不到了. 说动态语言重构性不好... php python 真的不熟. 不知道重构好不好.
但重构性在我的经验里. 与语言无关 .. clojure的项目 我一直在不断重构. java的也是重构不断 从 Struts spring hibernate guzz mybaties .... 其实一直不愿说哪个语言好,哪个不好. 我用java12年多. 转到clojure 3年多点. 最近之所以 宣传, 是因为不想太自私. 这个东西,真的有他的好, 你完全可以 java clojure 并用. clojure 只是真的会提高你一下.
动态语言重构困难是因为弱类型,类型边界模糊
2017-11-24 20:42
0
回复
举报

引用来自“michaely”的评论

隔壁的 Jboot 1.0 正式版也发布啦,依赖JFinal最新版本3.3 ... https://www.oschina.net/news/90816/jboot-1-0
我正在看jpress的代码😁
2017-11-24 18:29
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
回复
举报
更多评论
152 评论
67 收藏
分享
返回顶部
顶部