JFinal 2.0 发布,JAVA 极速 WEB+ORM 框架 - 开源中国社区
JFinal 2.0 发布,JAVA 极速 WEB+ORM 框架
JFinal 2015年06月18日

JFinal 2.0 发布,JAVA 极速 WEB+ORM 框架

JFinal JFinal 发布于2015年06月18日 收藏 228

腾讯云-1小时搭建人工智能应用,让技术更容易入门>>>  

JFinal 是本星球第一个提出极速开发理念,也是唯一个极速开发框架。自开源以来迅速获得广大开发者的喜爱,极速开发的优势逐步深入人心。由于极速开发威力巨大,所以有了以下在 OSChina 的惊人数据:

1:问答数2600个,在OSChina 在收录的37153个项目中总排名第五位,排前四位的项目分别是:java、android、php、mysql,前四个项目在 OSChina 的收录时间比 JFinal 要早一到四年,问答数量充分表明JFinal是OSChina最活跃的项目

相关链接:http://www.oschina.net/question/tags?catalog=1

2:git.oschina.net 上 fork、star、watch 数据全部排名第一

相关链接:http://git.oschina.net/languages/Java

3:按浏览数量在所有程序语言的web框架排名第二

相关链接:http://www.oschina.net/project/tag/127/webframework

4:git.oschina.net 与 JFinal 相关开源项目 164 个

相关链接:http://git.oschina.net/search?utf8=%E2%9C%93&search=jfinal&group_id=&project_id=

5:与 JFinal 相关博客 593 篇

相关链接:http://www.oschina.net/search?scope=blog&q=jfinal

然而 JFinal 从未停止过极速化的脚步,JFinal 2.0 继续专注于极速开发,将极速进行到底! 从控制层到业务层再到Model层,以及未来的在View层一直极速下去!以下是本次版本升级的主要功能:

一、极速化业务层 AOP 支持

JFinal 2.0 对业务层AOP提供了极速化支持,成为本星球第一个支持极速加特效的MVC + ORM + AOP 框架,只需 Duang.duang(target) 即可添加特效,以下是代码示例:

public void pay() {
  Service service = Duang.duang(Service.class, Tx.class);
  service.justDoIt(para); 
}

只需要通过 Duang.duang(target, interceptors) 即可为任意目标组件极速添加特效。当然,还有更多愉快的用法,例如:

public class OrderService {
  @Before(Tx.class)      // 拦截器与控制层完全一样的用法
  public void justDoIt() {
  }
}

以上是JFinal粉丝们一直钟爱的控制层拦截器用法,现在此用法可用于业务层,除此之外,还提供了拦截器注入用法,可以在无侵入 target 的同时为其添加特效,target 可以完全不知道 AOP 的存在:

public void action() {
  // 在controller中可直接用enhance()
  enhance(target, interceptors).justDoIt();

  // 在其它地方可使用 Enhancer.enhance()
  Enhancer.enhance(target, interceptors).justDoIt();
}

JFinal 2.0 全程 AOP 支持,并没有引入 IOC 容器,从而也不需要引入与 IOC 容器相配套的一坨坨 XML,不需要花费精力去码XML,即可愉快地玩耍。在 SSH 时代到处是一坨坨的 XML 累到死,然而并没有什么卵用!

二、极速化 redis 支持

public void play() {
  Redis.use().put(key, value);
  Redis.use().get(key);
}

代码量依然少到极致,但又不失功能的完备,hash、set、zset、list 的 API 保持了 redis 原有的命名,使学习成本降至最低。RedisPlugin 可同时支持多个 redis 实例,只需要指定cacheName即可:

 Redis.use("jfinalWeb").put(key, value);

三、极速化 ActiveRecord 复合主键支持

public void play() {
  // 映射时指定多主键,用逗号分隔
  arp.addMapping(tableName, "id1, id2, idn", modelClass);

  // 使用方式,传入多主键即可
  model.findById(id1, id2, idn);
  model.deleteById(id1, id2, idn);
}

支持任意多个复合主键,不局限于两个主键,JFinal 会自动进行复合主键数量判断,避免主键数量不符时出错。

四、极速化 Model 多数据源多table支持

当不同数据源中的相同表结构的 table 需要共享同一个 Model时,本特性非常有用,用法依然极速:

public void play() {
  // 从主数据源中取数据并保存到另一数据源
  model.findById(id).use("otherDataSource").save();
}

此特性用于多数据源的多table共享同一个Model的情况,如果Model唯一对应某个数据源的某个table,数据源的切换是自动且透明的。本功能实现仅用了 6 行代码,JFinal 架构可扩展性就是这么碉堡。

五:极速化 i18n 支持

public void play() {
  Res resEn = I18n.use("en_US");
  String msgEn = resEn.get("msg");
  String msgEnFormat = resEn.format("msg", "james", new Date());

  Res resZh = I18n.use("zh_CN");
  String msgZh = resZh.get("msg");
  String msgZhFormat = resZh.format("msg", "詹波", new Date());
}

立足于实践,对 i18n 进行了全面增强,更加极速的用法详见 JFinal 手册。

有朋友在说, JFinal 2.0 加了这么多特效,还让不让 SSH 们有心思继续堆 XML 了啊?没办法,以下还有更多特效继续冲击:

JFinal 2.0 changelog:

1:极速化业务层 AOP 支持
2:极速化 redis 支持
3:极速化 ActiveRecord 复合主键支持
4:极速化 Model 多数据源多table支持
5:极速化 i18n 支持
6:ActionInvocation 更名为 Invocation
7:ClearInterceptor更名为Clear,并增强功能,支持移除指定的拦截器,删掉ClearyLayer
8:添加 Model.findFirstByCache(...)、Db.findFirstByCache(...),方便对单个对象进行缓存,省时省力省代码
9:Model.findById 带String columns 参数的方法更名为 findByIdLoadColumns
10:删除 Db.findById 带String columns 的方法,可用 Db.findFirst 代替
11:改进 Validator,添加系列方法支持 urlPara 验证。添加setDatePattern(...)方法可指定Date的pattern
12:Db.batch(...) 系列方法添加事务及嵌套事务支持
13:添加 Config.isInTransaction() 方法
14:EncryptionKit 更名为 HashKit,并添加盐值生成方法generateSalt()
15:改进 Tx 拦截器,放行 ActionException,便于 renderError 正确响应 error code
16:添加 Sqls 工具类,用于加载和使用外部 sql 文件,例如:User.dao.find(Sqls.get("findAll"));
17:ActiveRecord 添加 SqlServerDialect 支持 SqlServer 数据库
18:添加 Controller.getParaValuesToLong(String)方法
19:添加 OreillyCos.setFileRenamePolicy(...) 支持自定义上传文件重名时的更名策略
20:改进 ActionMapping,在 actionKey 重复时终止启动而非输出警告,优化Action映射,进一步提升系统启动速度
21:TableBuilder 重构,进一步减少代码量、提升性能,提高可读性
22:添加 com.jfinal.ext.kit.ElResolverListener 支持 weblogic 等容器注册 EL增强
23:CacheInterceptor 添加 JsonRender 支持
24:去掉了 Render 类中所有方法的 final 关键字,更加便于扩展自定义 render
25:添加 PathKit.setRootClassPath(...) 方法,便于在如Resin这类容器下无法自动探测class目录时使用
26:JsonKit、JsonRender 默认转换深度增大到 15 层
27:添加 DbKit.removeConfig(...) 方法,便于动态管理多数源
28:改进 JettyServer 在启动过程中允许抛出异常终止启动并退出 JVM
29:改进 ActionException 在 renderError(...) 时支持 viewPath
30:移除 SpringPlugin
31:改进 PropKit,对多线程更加严格,让 PropKit 的重度使用者以及有代码洁癖工程师更加顺爽
32:改进 Controller,urlPara 转换错误由 500 error 改为 404 error
33:添加 Controller.checkUrlPara(...) 系列方法,支持严格 url,避免出现多余 urlPara
34:Tx 拦截器开放 getConfigWithTxConfig() 方法,方便扩展自定义事务拦截器
35:改进OneConnectionPerThread支持事务以及嵌套拦截
36:TxByActionMethods 更名为 TxByMethods,可用于拦截控制层于业务层
37:删除 Controller、Constants 中与 i18n 有关代码

ONE MORE THING: jfinal.com 极速开发平台正在构建中,为答谢JFinal粉丝一直以来的支持,JFinal 2.0 发布之际,暂时开放第一批用户注册,抢注 JFinal 极速开发社区账号,成为本星球第一个极速开发社区资深骨灰级会员,享受极速之快感,共同开启极速开发时代,永载极速史册!只需猛击这里:http://www.jfinal.com/reg

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 开源中国社区 [http://www.oschina.net]
本文标题:JFinal 2.0 发布,JAVA 极速 WEB+ORM 框架
分享
评论(405)
最新评论
0

引用来自“rich_xu”的评论

用Enhancer来写service时,配套使用的Ret希望能增加一个返回map或mapToJson方法,这样到了Controller层,不用再次处理了,就更方便了。
@JFinal

引用来自“JFinal”的评论

jfinal 2.1 已添加了 Ret.getMap() 方法。Ret 这么隐蔽的功能都普查你发现了哈,这个 Ret 正处在试验阶段,未来可能改成更好的名字,我希望她不仅可以用于灵活地用于多个返回值的场景,还希望可用作参数在方法间传递 ^_^
波总威武
0

引用来自“rich_xu”的评论

用Enhancer来写service时,配套使用的Ret希望能增加一个返回map或mapToJson方法,这样到了Controller层,不用再次处理了,就更方便了。
@JFinal
jfinal 2.1 已添加了 Ret.getMap() 方法。Ret 这么隐蔽的功能都普查你发现了哈,这个 Ret 正处在试验阶段,未来可能改成更好的名字,我希望她不仅可以用于灵活地用于多个返回值的场景,还希望可用作参数在方法间传递 ^_^
0
用Enhancer来写service时,配套使用的Ret希望能增加一个返回map或mapToJson方法,这样到了Controller层,不用再次处理了,就更方便了。
@JFinal
0
正准备升级2.0,大家说说mem与redis,我该如何选择?
0

引用来自“rich_xu”的评论

@JFinal 1.9版本的ClearInterceptor支持如下清除Interceptor:
@ClearInterceptor
public class IndexController extends Controller {
}
这处很实用,不用在每个method里都加上@Clear。2.0版本的Clear无法支持这种方法,希望能加上。
已做过备忘,jfinal 下一版本权衡考虑是否添加
0
@JFinal 1.9版本的ClearInterceptor支持如下清除Interceptor:
@ClearInterceptor
public class IndexController extends Controller {
}
这处很实用,不用在每个method里都加上@Clear。2.0版本的Clear无法支持这种方法,希望能加上。
0

引用来自“rich_xu”的评论

@JFinal Redis插件不支持Pub/Sub方法,这个也很重要的。
已支持绝大部分Redis API,后续版本会逐步添加剩下的
0
@JFinal Redis插件不支持Pub/Sub方法,这个也很重要的。
0

引用来自“紫电清霜”的评论

又来看来一下,辛苦了,波总的热情,好像一把火,燃烧了整个osc~

引用来自“JFinal”的评论

今天你 duang 了没^_^

引用来自“紫电清霜”的评论

波总的duang很厉害,可以在model里实现一个CacheInteceptor,@Before(CacheInteceptor.class),这样getXxx方法只需要专注操作数据库,缓存的逻辑放入CacheInteceptor里,哈!大赞波总。

引用来自“JFinal”的评论

话说你挺会用的啊,这么快就结合了 cache 来使用

引用来自“紫电清霜”的评论

不知道是不是强迫症,我一直在寻找简洁好用极速的缓存方法,之前试过的一直没能满意,Duang的出现带来了新思路。这都仰仗波总强大的jfinal。哈!:smile::smile::smile:

引用来自“JFinal”的评论

你这种追求,以及对技术的眼光,是成为优秀加构师的潜质
波总谬赞,我还差得远呢,哈。
0

引用来自“紫电清霜”的评论

又来看来一下,辛苦了,波总的热情,好像一把火,燃烧了整个osc~

引用来自“JFinal”的评论

今天你 duang 了没^_^

引用来自“紫电清霜”的评论

波总的duang很厉害,可以在model里实现一个CacheInteceptor,@Before(CacheInteceptor.class),这样getXxx方法只需要专注操作数据库,缓存的逻辑放入CacheInteceptor里,哈!大赞波总。

引用来自“JFinal”的评论

话说你挺会用的啊,这么快就结合了 cache 来使用

引用来自“紫电清霜”的评论

也受到spring cache注解的启发。不过spring太厚重了。用起来没jfinal好。
JFinal 的 Duang 将 AOP 做到极简,target无需实现任何接口,无需IOC、无需XML,Inject拦截无需annotation,无需Aspect、无需jointcut、无需jointpoint等等这些东东,只需轻轻的一Duang 立即就可使用
0

引用来自“紫电清霜”的评论

又来看来一下,辛苦了,波总的热情,好像一把火,燃烧了整个osc~

引用来自“JFinal”的评论

今天你 duang 了没^_^

引用来自“紫电清霜”的评论

波总的duang很厉害,可以在model里实现一个CacheInteceptor,@Before(CacheInteceptor.class),这样getXxx方法只需要专注操作数据库,缓存的逻辑放入CacheInteceptor里,哈!大赞波总。

引用来自“JFinal”的评论

话说你挺会用的啊,这么快就结合了 cache 来使用

引用来自“紫电清霜”的评论

不知道是不是强迫症,我一直在寻找简洁好用极速的缓存方法,之前试过的一直没能满意,Duang的出现带来了新思路。这都仰仗波总强大的jfinal。哈!:smile::smile::smile:
你这种追求,以及对技术的眼光,是成为优秀加构师的潜质
0

引用来自“紫电清霜”的评论

又来看来一下,辛苦了,波总的热情,好像一把火,燃烧了整个osc~

引用来自“JFinal”的评论

今天你 duang 了没^_^

引用来自“紫电清霜”的评论

波总的duang很厉害,可以在model里实现一个CacheInteceptor,@Before(CacheInteceptor.class),这样getXxx方法只需要专注操作数据库,缓存的逻辑放入CacheInteceptor里,哈!大赞波总。

引用来自“JFinal”的评论

话说你挺会用的啊,这么快就结合了 cache 来使用
也受到spring cache注解的启发。不过spring太厚重了。用起来没jfinal好。
0

引用来自“紫电清霜”的评论

又来看来一下,辛苦了,波总的热情,好像一把火,燃烧了整个osc~

引用来自“JFinal”的评论

今天你 duang 了没^_^

引用来自“紫电清霜”的评论

波总的duang很厉害,可以在model里实现一个CacheInteceptor,@Before(CacheInteceptor.class),这样getXxx方法只需要专注操作数据库,缓存的逻辑放入CacheInteceptor里,哈!大赞波总。

引用来自“JFinal”的评论

话说你挺会用的啊,这么快就结合了 cache 来使用
不知道是不是强迫症,我一直在寻找简洁好用极速的缓存方法,之前试过的一直没能满意,Duang的出现带来了新思路。这都仰仗波总强大的jfinal。哈!:smile::smile::smile:
0

引用来自“紫电清霜”的评论

又来看来一下,辛苦了,波总的热情,好像一把火,燃烧了整个osc~

引用来自“JFinal”的评论

今天你 duang 了没^_^

引用来自“紫电清霜”的评论

波总的duang很厉害,可以在model里实现一个CacheInteceptor,@Before(CacheInteceptor.class),这样getXxx方法只需要专注操作数据库,缓存的逻辑放入CacheInteceptor里,哈!大赞波总。
话说你挺会用的啊,这么快就结合了 cache 来使用
0

引用来自“紫电清霜”的评论

又来看来一下,辛苦了,波总的热情,好像一把火,燃烧了整个osc~

引用来自“JFinal”的评论

今天你 duang 了没^_^

引用来自“紫电清霜”的评论

波总的duang很厉害,可以在model里实现一个CacheInteceptor,@Before(CacheInteceptor.class),这样getXxx方法只需要专注操作数据库,缓存的逻辑放入CacheInteceptor里,哈!大赞波总。
duang duang duang 就是这么顺爽,还有很多要用起来的朋友即将体验到不一样的顺爽
0

引用来自“紫电清霜”的评论

又来看来一下,辛苦了,波总的热情,好像一把火,燃烧了整个osc~

引用来自“JFinal”的评论

今天你 duang 了没^_^
波总的duang很厉害,可以在model里实现一个CacheInteceptor,@Before(CacheInteceptor.class),这样getXxx方法只需要专注操作数据库,缓存的逻辑放入CacheInteceptor里,哈!大赞波总。
0

引用来自“紫电清霜”的评论

又来看来一下,辛苦了,波总的热情,好像一把火,燃烧了整个osc~
今天你 duang 了没^_^
0
激情满满,兢兢业业!
0
又来看来一下,辛苦了,波总的热情,好像一把火,燃烧了整个osc~
0
Duang
顶部