多年前看过周星驰的电影《功夫》,里头的大 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 对模板引擎主要采用了如下优化方法:
采用 "笼罩" 式设计,引入 WriterBuffer 覆盖于入参 Writer、OutputStream 之上,使用内部的 byte[] buffer、char[] buffer、DateFormat 尽可能避免内存分配
ExprList、StatList 避免在单一内部对象时 for 循环
添加 byte 模式,使得模板静态内容只 encode 一次
fnv 64 算法代替 StingBuider 拼接字符串生成 hash
优化 Integer、Double、Float、Boolean 等类型数据输出
优化日期类型格式化,回收利用 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
引用来自“蔫老虎”的评论
两年前掉到JFinal这个坑里以后,就不愿意出来了。极速,极简,一把Java开发的瑞士军刀。能让开发者把精力都集中在业务逻辑,无视框架的存在。感谢作者开源这么好的作品。引用来自“德莫罗”的评论
@JFinal是否考虑过支持微服务模式?感觉最典型的应用场景还是单体应用,如果在微服务模式下,注册发现,安全,熔断,统一配置中心这些是否能提供支持或者解决方案。
引用来自“fengxingzhe”的评论
刚有个回复找不到了. 说动态语言重构性不好... php python 真的不熟. 不知道重构好不好.但重构性在我的经验里. 与语言无关 .. clojure的项目 我一直在不断重构. java的也是重构不断 从 Struts spring hibernate guzz mybaties .... 其实一直不愿说哪个语言好,哪个不好. 我用java12年多. 转到clojure 3年多点. 最近之所以 宣传, 是因为不想太自私. 这个东西,真的有他的好, 你完全可以 java clojure 并用. clojure 只是真的会提高你一下.
哈哈哈哈
引用来自“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 一直在拓展认知边界
引用来自“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不适合记忆力象我一样差、又无法保证一次写正确的弱手😁)https://segmentfault.com/a/1190000000696419 不说话. you just to kan
引用来自“颖辉小居”的评论
我比较关心,这个问题还存在吗?https://www.oschina.net/question/2507499_2244106JsonManager.me().setDefaultDatePattern("yyyy-MM-dd HH🇲🇲ss")
日期型数据只要先确保时分秒确实存在,剩下的就是一个 pattern 配置的事
引用来自“德莫罗”的评论
@JFinal是否考虑过支持微服务模式?感觉最典型的应用场景还是单体应用,如果在微服务模式下,注册发现,安全,熔断,统一配置中心这些是否能提供支持或者解决方案。
jfinal 一直以来都定位于 MVC + ORM,这个与微服务模式并不冲突,在微服务架构中使用 jfinal 是很自然的事情
是否考虑过支持微服务模式?感觉最典型的应用场景还是单体应用,如果在微服务模式下,注册发现,安全,熔断,统一配置中心这些是否能提供支持或者解决方案。
引用来自“eurry”的评论
jfinal down不下来啊,网速慢如蜗牛引用来自“哈库纳”的评论
Guice 在一出生就是 Api 引导式,还有数不胜数的其它框架工具。api引导式应该算不上什么独创吧,有点特意宣传的味道。
是否提炼为概念,是否广泛、刻意应用才是关键。例如两百年前并没有“加速度”这个概念,人类经常可以感知到加速度,甚至用其造出实用的装置。 但直到物理学家提炼出“加速度”这个概念后才能广泛、刻意去应用“加速度”概念指导性地做事情
再比如,在 IOC、DI 这个概念出来之前,一定有人偶尔用到过 IOC、DI,但直到这两个概念真正并提炼出来,并广泛、刻意应用到 spring 之中时才能说 spring 基于了这个核心思想去设计
回到 jfinal,绝大部分依赖并不是 new 出来写死的,而是通过 setter 方法注入的,但 jfinal 从来不会说应用了 IOC、DI。
引用来自“Jieven”的评论
天下武功,唯快不破引用来自“坐定定”的评论
jfinal 和 spring+mybatic 的性能测试有没有去掉freemarker?引用来自“JFinal”的评论
必然去掉了,用了编译型的 JSP,性能足够快,测试使用同一台电脑,tomcat、mysql 用的相同的,用于测试的 localhost/blog/list 这个 action 使用完全相同的 sql 语句源码:https://gitee.com/jfinal/jfinal-performance
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
引用来自“开源中国首席董事长”的评论
这个QPS 。 应该是慢在视图上面吧 模板引擎引用来自“JFinal”的评论
2011 年的古老测试机,机械硬盘,有数据库读取操作,磁道定位是机械动作会很慢。 这个测试仅为了在同样硬件,同样软件的情况下对比 jfinal 与 spring + mybatis 性能,而不在 QPS 的绝对值引用来自“orpherus”的评论
我建议做测试时只输出json,不要输出html,毕竟现在输出html的需求比较小了,模板也是互换性很强的组件。小量数据反复查,mysql自己有cache,文件系统还有一层cache,几乎不会有磁盘io产生。
引用来自“orpherus”的评论
qps才3000多,比php还慢一个数量级,能把java写成这样也是没谁了引用来自“坐定定”的评论
jfinal 和 spring+mybatic 的性能测试有没有去掉freemarker?源码:https://gitee.com/jfinal/jfinal-performance
引用来自“TerryZ”的评论
咦,看来Spring Boot是抄袭JFinal的了!引用来自“JFinal”的评论
这个肯定不是,只是部分设计在理念上相似,不同的人在不同的时间点产生相同的相法是并不罕见,不过有一点可以肯定,去除 xml、采用 api 引导式 config 这个 jfinal 比 spring boot 早很多年引用来自“龅牙驴”的评论
波总啊,什么时候增加一个类似 flash message 的东西呢?后台开发 redirect页面的时候,这个东西非常有用啊,这个建议已经提了两年了,希望你体会开发者心中所急需啊! https://docs.djangoproject.com/en/1.11/ref/contrib/messages/引用来自“JFinal”的评论
这个很久以前被人提出,当时没顾上,但后来再也没有人提到过,我以为是 jfinal 的新功能自然消解掉了这个需求falsh message 的这个功能通过类似于 token 的机制很好解决吧?
引用来自“龅牙驴”的评论
jfinal 新功能哪些可以类似 flash message 这个功能的?我现在为了方便,只能使用session 代替了。场景很多是这样的:新增 编辑成功后,写入提示信息,再跳转到 列表里,显示提示信息,清除掉信息。引用来自“乌龟壳”的评论
url里加个参数完事了。。。引用来自“TerryZ”的评论
咦,看来Spring Boot是抄袭JFinal的了!引用来自“JFinal”的评论
这个肯定不是,只是部分设计在理念上相似,不同的人在不同的时间点产生相同的相法是并不罕见,不过有一点可以肯定,去除 xml、采用 api 引导式 config 这个 jfinal 比 spring boot 早很多年引用来自“龅牙驴”的评论
波总啊,什么时候增加一个类似 flash message 的东西呢?后台开发 redirect页面的时候,这个东西非常有用啊,这个建议已经提了两年了,希望你体会开发者心中所急需啊! https://docs.djangoproject.com/en/1.11/ref/contrib/messages/引用来自“JFinal”的评论
这个很久以前被人提出,当时没顾上,但后来再也没有人提到过,我以为是 jfinal 的新功能自然消解掉了这个需求falsh message 的这个功能通过类似于 token 的机制很好解决吧?
引用来自“龅牙驴”的评论
jfinal 新功能哪些可以类似 flash message 这个功能的?我现在为了方便,只能使用session 代替了。场景很多是这样的:新增 编辑成功后,写入提示信息,再跳转到 列表里,显示提示信息,清除掉信息。引用来自“乌龟壳”的评论
url里加个参数完事了。。。引用来自“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就几乎是法拉利.引用来自“TerryZ”的评论
咦,看来Spring Boot是抄袭JFinal的了!引用来自“JFinal”的评论
这个肯定不是,只是部分设计在理念上相似,不同的人在不同的时间点产生相同的相法是并不罕见,不过有一点可以肯定,去除 xml、采用 api 引导式 config 这个 jfinal 比 spring boot 早很多年引用来自“龅牙驴”的评论
波总啊,什么时候增加一个类似 flash message 的东西呢?后台开发 redirect页面的时候,这个东西非常有用啊,这个建议已经提了两年了,希望你体会开发者心中所急需啊! https://docs.djangoproject.com/en/1.11/ref/contrib/messages/引用来自“JFinal”的评论
这个很久以前被人提出,当时没顾上,但后来再也没有人提到过,我以为是 jfinal 的新功能自然消解掉了这个需求falsh message 的这个功能通过类似于 token 的机制很好解决吧?
引用来自“龅牙驴”的评论
jfinal 新功能哪些可以类似 flash message 这个功能的?我现在为了方便,只能使用session 代替了。场景很多是这样的:新增 编辑成功后,写入提示信息,再跳转到 列表里,显示提示信息,清除掉信息。引用来自“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就几乎是法拉利.引用来自“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 部分思想吸收过 ruby、python 语言,及其之下框架的优点。jfinal 一直在拓展认知边界
不过看了攻守道就知道,天下武功,无坚不破,无快不破,唯钱不破。😆
引用来自“TerryZ”的评论
咦,看来Spring Boot是抄袭JFinal的了!引用来自“JFinal”的评论
这个肯定不是,只是部分设计在理念上相似,不同的人在不同的时间点产生相同的相法是并不罕见,不过有一点可以肯定,去除 xml、采用 api 引导式 config 这个 jfinal 比 spring boot 早很多年引用来自“龅牙驴”的评论
波总啊,什么时候增加一个类似 flash message 的东西呢?后台开发 redirect页面的时候,这个东西非常有用啊,这个建议已经提了两年了,希望你体会开发者心中所急需啊! https://docs.djangoproject.com/en/1.11/ref/contrib/messages/引用来自“JFinal”的评论
这个很久以前被人提出,当时没顾上,但后来再也没有人提到过,我以为是 jfinal 的新功能自然消解掉了这个需求falsh message 的这个功能通过类似于 token 的机制很好解决吧?
引用来自“easymbol”的评论
确实简化了许多开发过程,jfinal3.1开始上车,第二个项目采用jfinal3.2 结果...第二个项目还未开发完...jfinal3.3的都出来了,速度太溜引用来自“JFinal”的评论
jfinal 3.2 升级到 jfinal 3.3,秒秒钟的事,但获得的好处是超值的引用来自“Barrylo”的评论
jfinal redis插件什么时候支持哨兵模式?引用来自“TerryZ”的评论
咦,看来Spring Boot是抄袭JFinal的了!引用来自“JFinal”的评论
这个肯定不是,只是部分设计在理念上相似,不同的人在不同的时间点产生相同的相法是并不罕见,不过有一点可以肯定,去除 xml、采用 api 引导式 config 这个 jfinal 比 spring boot 早很多年引用来自“龅牙驴”的评论
波总啊,什么时候增加一个类似 flash message 的东西呢?后台开发 redirect页面的时候,这个东西非常有用啊,这个建议已经提了两年了,希望你体会开发者心中所急需啊! https://docs.djangoproject.com/en/1.11/ref/contrib/messages/falsh message 的这个功能通过类似于 token 的机制很好解决吧?
引用来自“开源中国首席董事长”的评论
这个QPS 。 应该是慢在视图上面吧 模板引擎引用来自“Jieven”的评论
天下武功,唯快不破引用来自“badouyuren”的评论
JFinal,国产开源软件的骄傲。憨憨电影,今天升级3.3。jfinal 再出一些企业家的开源项目就好了,生态更完整了~
引用来自“TerryZ”的评论
咦,看来Spring Boot是抄袭JFinal的了!引用来自“JFinal”的评论
这个肯定不是,只是部分设计在理念上相似,不同的人在不同的时间点产生相同的相法是并不罕见,不过有一点可以肯定,去除 xml、采用 api 引导式 config 这个 jfinal 比 spring boot 早很多年引用来自“Jieven”的评论
抄袭设计理念这种事没法证明,只能说明有很大嫌疑,跑在后面的都有嫌疑.不过以Spring的能量肯定不会低端到抄袭代码.
但是我敢肯定这颗星球上,代码的经济适用性能超越JFinal的还真没几个.
最恶心的一群人是,之前一直推崇Spring,整一堆xml配置,各种Bean各种注入,还乐此不疲.
当SpringBoot出来的时候一个个又屁颠屁颠的开始舔SB.
却忘了自己当初的思想,和言论,各种配置大法好.
Spring把EJB整死了,坐等Spring死球子,早晚的事.
引用来自“easymbol”的评论
确实简化了许多开发过程,jfinal3.1开始上车,第二个项目采用jfinal3.2 结果...第二个项目还未开发完...jfinal3.3的都出来了,速度太溜引用来自“TerryZ”的评论
咦,看来Spring Boot是抄袭JFinal的了!引用来自“JFinal”的评论
这个肯定不是,只是部分设计在理念上相似,不同的人在不同的时间点产生相同的相法是并不罕见,不过有一点可以肯定,去除 xml、采用 api 引导式 config 这个 jfinal 比 spring boot 早很多年引用来自“Jieven”的评论
抄袭设计理念这种事没法证明,只能说明有很大嫌疑,跑在后面的都有嫌疑.不过以Spring的能量肯定不会低端到抄袭代码.
但是我敢肯定这颗星球上,代码的经济适用性能超越JFinal的还真没几个.
最恶心的一群人是,之前一直推崇Spring,整一堆xml配置,各种Bean各种注入,还乐此不疲.
当SpringBoot出来的时候一个个又屁颠屁颠的开始舔SB.
却忘了自己当初的思想,和言论,各种配置大法好.
Spring把EJB整死了,坐等Spring死球子,早晚的事.
引用来自“玛雅牛”的评论
速速这么牛了。看来要全面使用jfinal全家桶了。😆引用来自“TerryZ”的评论
咦,看来Spring Boot是抄袭JFinal的了!引用来自“JFinal”的评论
这个肯定不是,只是部分设计在理念上相似,不同的人在不同的时间点产生相同的相法是并不罕见,不过有一点可以肯定,去除 xml、采用 api 引导式 config 这个 jfinal 比 spring boot 早很多年不过以Spring的能量肯定不会低端到抄袭代码.
但是我敢肯定这颗星球上,代码的经济适用性能超越JFinal的还真没几个.
最恶心的一群人是,之前一直推崇Spring,整一堆xml配置,各种Bean各种注入,还乐此不疲.
当SpringBoot出来的时候一个个又屁颠屁颠的开始舔SB.
却忘了自己当初的思想,和言论,各种配置大法好.
Spring把EJB整死了,坐等Spring死球子,早晚的事.
引用来自“红薯”的评论
文采可以啊引用来自“TerryZ”的评论
咦,看来Spring Boot是抄袭JFinal的了!引用来自“JFinal”的评论
这个肯定不是,只是部分设计在理念上相似,不同的人在不同的时间点产生相同的相法是并不罕见,不过有一点可以肯定,去除 xml、采用 api 引导式 config 这个 jfinal 比 spring boot 早很多年引用来自“TerryZ”的评论
咦,看来Spring Boot是抄袭JFinal的了!引用来自“JFinal”的评论
这个肯定不是,只是部分设计在理念上相似,不同的人在不同的时间点产生相同的相法是并不罕见,不过有一点可以肯定,去除 xml、采用 api 引导式 config 这个 jfinal 比 spring boot 早很多年引用来自“TerryZ”的评论
咦,看来Spring Boot是抄袭JFinal的了!引用来自“orpherus”的评论
qps才3000多,比php还慢一个数量级,能把java写成这样也是没谁了引用来自“Jieven”的评论
天下武功,唯快不破引用来自“JFinal”的评论
天下武功,唯快不破引用来自“Jieven”的评论
天下武功,唯快不破引用来自“红薯”的评论
文采可以啊还少两三个 jar 包,只有 207KB 体积,对第三方无依赖
引用来自“红鼠、”的评论
鄙视springboot,一直在模仿jfinal这个评论会自动亮,信不信你看着,别眨眼~
很开心自己能见证能经历国产的开源框架一步步的产生\发展\壮大,比如Jfinal,比如Echarts,相信自己也会跟着jfinal一步步成长吧.
感谢波总,确实灰常努力,加油波总,加油自己.
ps:男人有的方面太快好像不是好事(逃)