文档章节

JFinal 自动探测Model 注册插件 AutoScanPlugin

绝望的八皮
 绝望的八皮
发布于 2012/07/18 23:07
字数 598
阅读 1147
收藏 9

本插件已经整合重构,新版本自动注册model插件请看这个博客

http://my.oschina.net/b1412/blog/68083

 

--------------------------------------------------------------------------------

在ssh等框架中有不少自动扫包注册的功能,当我们类较多的时候可以减少不少的工作。

根据这个思路写了个简单的自动扫包注册Model的插件。
扫描classes下面所以继承了Model的类注册到ActiveRecordPlugin中。数据库表名默认采用骆峰。
比如MobileBind.Java则映射到mobieBind表.另外也可以选择全部大写和全部小写的策略.


/**
	 * 配置插件
	 */
	public void configPlugin(Plugins me) {
		DruidPlugin druidPlugin = new DruidPlugin.DruidBuilder(getProperty("url"), getProperty("username"),
				getProperty("password")).build();
		me.add(druidPlugin);
		ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin);
		arp.setShowSql(true);
      	        SqlReporter.setLogger(true);
		AutoScanPlugin autoScanPligin = new AutoScanPlugin(arp,TableNameStyle.LOWER);
                me.add(autoScanPligin);  //自动扫包注册model插件要在ActiveRecordPlugin之前注册         	
                me.add(arp);	      
       }


package com.jfinal.plugin.autoscan;
import java.io.File;
import java.net.URL;
import java.util.List;

import com.cloud.pxxt.Config;
import com.jfinal.plugin.IPlugin;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.Model;
import com.jfinal.util.StringKit;

/**
 *  自动扫包
 */
public class AutoScanPlugin implements IPlugin {
	private ActiveRecordPlugin arp;

	private TableNameStyle tableNameStyle;
	
	public AutoScanPlugin(ActiveRecordPlugin arp) {
		this.arp = arp;
	}
	public AutoScanPlugin(ActiveRecordPlugin arp,TableNameStyle tableNameStyle) {
		this.arp = arp;
		this.tableNameStyle = tableNameStyle;
	}

	@Override
	public boolean start() {
		try {
			registModel(AutoScanPlugin.class.getResource("/").getFile(), "classes/");
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		return true;
	}

	@Override
	public boolean stop() {
		return true;
	}

	private void registModel(String fileDir, String pre) throws Exception {
		List<File> classList = FileSearcher.findFiles(fileDir, "*.class");
		for (File classFile : classList) {
			String className = getClassName(classFile, pre);
			Class clazz = Class.forName(className);
			if (clazz.getSuperclass() == Model.class) {
				String tableName = clazz.getSimpleName();
				if(tableNameStyle==TableNameStyle.UP){
					tableName =tableName.toUpperCase();
				}else if(tableNameStyle==TableNameStyle.LOWER){
					tableName =tableName.toLowerCase();
				}else{
					tableName =StringKit.firstCharToLowerCase(tableName);

				}
				arp.addMapping(tableName, clazz);
			}
		}
	}

	private static String getClassName(File classFile, String pre) {
		String objStr = classFile.toString().replaceAll("\\\\", "/");
		String className;
		className = objStr.substring(objStr.indexOf(pre)+pre.length(),objStr.indexOf(".class"));
		if (className.startsWith("/")) {
			className = className.substring(className.indexOf("/")+1);
		}
		return className.replaceAll("/", ".");
	}

}

package com.jfinal.plugin.autoscan;

public enum TableNameStyle {
	UP,LOWER
}

 
 
  其他还有些自动探测的方法,比如我们约定Model对象都用xxModel.java那么可以在探测的时候直接根据这个文件名规则找到所以Model.
目前这种方式是加载类根据该类的父类是否为Mode作为条件.代价要大一点.

 一些问题.,这样自动探测的表名映射规则是否够用,如果数据库表明不是很规则的可能需要再扩展几个根据类名生存数据库表明的策略,比如oracle数据库很多带下划线的命名方式.
另外这种方式还无法探测jar包里面的Model.以后再实现.
 
  以上给大家提供个思路,请高手不惜赐教.

 虽然JFinal本身已经够简单代码量少了,不过我们还可让写的代码更少一些~



 

© 著作权归作者所有

共有 人打赏支持
上一篇: JFinal QuartzPlugin
下一篇: JFinal SqlInXmlPlugin
绝望的八皮

绝望的八皮

粉丝 392
博文 22
码字总数 10505
作品 2
其它
CTO(技术副总裁)
私信 提问
加载中

评论(14)

人在海途
人在海途

引用来自“JFinal”的评论

引用来自“绝望的八皮”的评论

引用来自“JFinal”的评论

思路相当不错,代码没有最省,只有更省 :)

还有个控制器的自动注册,思路也和这个一样的,只是controllerkey的命名暂时还没想好。按道理说一般应该是
  /**
   * 配置路由
   */
  public void configRoute(Routes me) {
    me.add("/mobileBind",MobileBindController.class);
  }
但是探测到MobileBindControl这个类怎么转换一个controllerkey是一个问题,如果直接像model一样策略不能截掉多余的Controller字符串,也可以把需要截掉的字符串作为一个参数动态的传参,但是也可能命名不规则。当然其实也做这种类似的功能确实也需要一些约定才能更敏捷把。

可能有两种方式:
1:根据Controller命名来约定,例如 BlogController的controllerKey就是 blog
2:在Controller上中annotation指定controllerKey
以上两种方式可以一起使用,优先annotation中指定的controllerKey
自动扫描路由配置 http://my.oschina.net/mousai/blog/81991
绝望的八皮
绝望的八皮

引用来自“缪斯的情人”的评论

引用来自“绝望的八皮”的评论

引用来自“缪斯的情人”的评论

现在遇到个很奇怪的问题:
1.我在一个controller里面调用另一个package里面的model
2.新建一个package包和该model所在的package包目录平行,且在该model所在包下面(字母顺序)
3.此时自动扫描表会扫描不到model,但是删除新建的包,或者新建的包在model上面就没问题了

每一个model在启动时候如果注册上了有这样的日志。
logger.debug("auto bindTable: addMapping({}, {})"
你启动一下看到底注册上你的model没有。

问题已解决,代码本身没问题,是我用的作者重构前的代码,感谢八皮的帮助

我开个了github账号,我会抽空把做过的都放上去,暂时还是空项目,欢迎大家互粉。
https://github.com/zhoulei-kid
缪斯的情人
缪斯的情人

引用来自“绝望的八皮”的评论

引用来自“缪斯的情人”的评论

现在遇到个很奇怪的问题:
1.我在一个controller里面调用另一个package里面的model
2.新建一个package包和该model所在的package包目录平行,且在该model所在包下面(字母顺序)
3.此时自动扫描表会扫描不到model,但是删除新建的包,或者新建的包在model上面就没问题了

每一个model在启动时候如果注册上了有这样的日志。
logger.debug("auto bindTable: addMapping({}, {})"
你启动一下看到底注册上你的model没有。

问题已解决,代码本身没问题,是我用的作者重构前的代码,感谢八皮的帮助
绝望的八皮
绝望的八皮

引用来自“缪斯的情人”的评论

现在遇到个很奇怪的问题:
1.我在一个controller里面调用另一个package里面的model
2.新建一个package包和该model所在的package包目录平行,且在该model所在包下面(字母顺序)
3.此时自动扫描表会扫描不到model,但是删除新建的包,或者新建的包在model上面就没问题了

这篇博客已经是比较老的一个版本,最新版本的见顶上的链接。

重构之后的是继承了jfinal原生的arp,必须要再单独注册。
那篇博客中我已经说明了“由于AutoTableBindPlugin继承自ActiveRecordPlugin,所以不需要单独注册它了.”

你删除重复注册的代码然后试一试
绝望的八皮
绝望的八皮

引用来自“os4china”的评论

如果你的model在jar中,这个就找不到了

嗯,暂时还没有去实现这个。我查了下资料,看用JarEntry能实现不。
绝望的八皮
绝望的八皮

引用来自“缪斯的情人”的评论

现在遇到个很奇怪的问题:
1.我在一个controller里面调用另一个package里面的model
2.新建一个package包和该model所在的package包目录平行,且在该model所在包下面(字母顺序)
3.此时自动扫描表会扫描不到model,但是删除新建的包,或者新建的包在model上面就没问题了

每一个model在启动时候如果注册上了有这样的日志。
logger.debug("auto bindTable: addMapping({}, {})"
你启动一下看到底注册上你的model没有。
osrchina
osrchina
如果你的model在jar中,这个就找不到了
缪斯的情人
缪斯的情人
现在遇到个很奇怪的问题:
1.我在一个controller里面调用另一个package里面的model
2.新建一个package包和该model所在的package包目录平行,且在该model所在包下面(字母顺序)
3.此时自动扫描表会扫描不到model,但是删除新建的包,或者新建的包在model上面就没问题了
JFinal
JFinal

引用来自“绝望的八皮”的评论

引用来自“JFinal”的评论

思路相当不错,代码没有最省,只有更省 :)

还有个控制器的自动注册,思路也和这个一样的,只是controllerkey的命名暂时还没想好。按道理说一般应该是
  /**
   * 配置路由
   */
  public void configRoute(Routes me) {
    me.add("/mobileBind",MobileBindController.class);
  }
但是探测到MobileBindControl这个类怎么转换一个controllerkey是一个问题,如果直接像model一样策略不能截掉多余的Controller字符串,也可以把需要截掉的字符串作为一个参数动态的传参,但是也可能命名不规则。当然其实也做这种类似的功能确实也需要一些约定才能更敏捷把。

可能有两种方式:
1:根据Controller命名来约定,例如 BlogController的controllerKey就是 blog
2:在Controller上中annotation指定controllerKey
以上两种方式可以一起使用,优先annotation中指定的controllerKey
绝望的八皮
绝望的八皮

引用来自“JFinal”的评论

思路相当不错,代码没有最省,只有更省 :)

还有个控制器的自动注册,思路也和这个一样的,只是controllerkey的命名暂时还没想好。按道理说一般应该是
  /**
   * 配置路由
   */
  public void configRoute(Routes me) {
    me.add("/mobileBind",MobileBindController.class);
  }
但是探测到MobileBindControl这个类怎么转换一个controllerkey是一个问题,如果直接像model一样策略不能截掉多余的Controller字符串,也可以把需要截掉的字符串作为一个参数动态的传参,但是也可能命名不规则。当然其实也做这种类似的功能确实也需要一些约定才能更敏捷把。
修改整合的Jfinal的Model自动绑定表插件 AutoTableBindPlugin

之前发过一个 JFinal 自动探测Model 注册插件 AutoScanPlugin http://my.oschina.net/b1412/blog/67764 然后参考了 @Flio 对我的代码做出的扩展 jfinal的Model自动绑定表插件 http://www.osc...

绝望的八皮
2012/07/20
0
9
JFinal Extensions 1.0 发布,JFinal 扩展

Jfinal-ext是对java极速web框架 jfinal 的一个扩充,主要利用jfinal的plugin机制集成各种第三方框架,像spring一样,简化开发者的学习应用成本,使用时请将jfinal.jar先引入工程。 Jfinal-e...

绝望的八皮
2012/10/14
1K
13
JFinal-event v2.2.2 发布,支持JFinal 3.5 新版本inject

JFinal-event 2.x 参考Spring 4.2.x中Event的使用方式而生,为JFinal用户带来更多方便。 更新情况: 2018-10-09 v2.2.2 升级到jfinal 3.5 (不兼容老版本)支持新版本inject,升级到java 8优化...

如梦技术
2018/10/09
557
3
JFinal自动扫描表绑定model(包含jar包扫描)

前段时间 @绝望的八皮 写了个自动探测model注册插件,见:http://my.oschina.net/b1412/blog/67764 主要功能是为了省去在系统的config中每个model对应表名的配置,通过注解的方式绑定相应的表...

缪斯的情人
2012/09/29
0
1
JFinal 2.0 发布,JAVA 极速 WEB+ORM 框架

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

JFinal
2015/06/18
26.2K
405

没有更多内容

加载失败,请刷新页面

加载更多

Android Messenger进程间客户端向服务端传递数据

Messenger:客户端向服务端传递数据 1.Service: public class MessengerService extends Service { private Messenger messenger = new Messenger(new Handler() { public void handleMess......

Coding缘
9分钟前
0
0
Pod在多可用区worker节点上的高可用部署

一、 需求分析 当前kubernetes集群中的worker节点可以支持添加多可用区中的ECS,这种部署方式的目的是可以让一个应用的多个pod(至少两个)能够分布在不同的可用区,起码不能分布在同一个可用...

zhaowei121
28分钟前
1
0
oracle XTTS介绍

一、什么是XTTS 首先什么是XTTS。XTTS其实是从TTS来的,TTS其实也是传输数据的一种手段,传输数据的时候可能用过EXP的方式,再往后可能用数据泵导入导出一些数据,或者去做备份然后再恢复。其...

突突突酱
28分钟前
0
0
[缺陷分析]半同步下多从库复制异常

引 言 本文是由爱可生研发团队出品的「图解MySQL」系列文章,不定期更新,但篇篇精品。 爱可生开源社区持续运营维护的小目标: 每周至少推送一篇高质量技术文章 每月研发团队发布开源组件新版...

爱可生
28分钟前
0
0
二维数组序号重置

public static function unique_arr($array2D,$stkeep=false,$ndformat=true){ // 判断是否保留一级数组键 (一级数组键可以为非数字) if($stkeep) $stArr = array_keys($array2D); // 判断是......

dragon_tech
31分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部