JFinal源码分析------plugin的故事

额...对不住各位,最近忙了点,博文么,没有及时更新,今天稍微有点时间,上来码码字,也算是放松了 前些时间,咱们主要看的事情关于初始化的那些个事情,其实细节不少,不过归纳一下也就如下的几点:web

一、容器从web.XML中加载JFinalFilter数据库

二、JFinalFilter进行初始化,读取咱们本身配置的configClass缓存

三、在初始化的过程当中分别从Constant中读取设置的常量,创建ActionMapping,加载数据库配置文件,建立MainRenderFactory(渲染视图的工厂类),执行咱们自定义的那个Config类,执行里面继承的方法app

四、等待URL访问执行框架

基本上有着四个步骤,初始化的工做基本算是完了!(固然,不少细节。各位看官请看源码,这里的细节不少)编辑器

当咱们完成了初始化工做之后,在进行URL访问的时候,基本上就是ActionMapping的职责范围了,在这个范围里面,就能够开始咱们真正的业务编写了,鉴于应用的复杂程度,咱们能够分别在Contrllor中编写(简单的CRUD),若是牵扯到很复杂的业务是时候,咱们能够抽一个层,至于名字叫什么,本身想吧,这个每一个公司都有不一样的叫法,好了扯多了,今天主要试看看咱们一些Plugin的东西ide

在Plugin中了,JFinal继承了一下几个东西:ui

一、ActiveRecord(这个用的应该蛮多的,Demo里面你继承的那个Model就是从这里面来的)code

二、C3p0(数据库的链接池么,Demo里面应该也是可以看到他的身影的)xml

三、Druid(淘宝的一个链接池,据目测很强大,具体有多强大,看看淘宝就应该知道了吧)

四、Ehcache(JAVA注明的缓存框架,一看就知道这个东西是作缓存的)

五、Spring 框架(JAVA注明的框架,反正本人对这个不太感冒,至今也没有搞明白Spring可以干啥)

嗯 今天不对各个Plugin作具体分析,主要是看看那 他是被怎么加进去初始化的!!!

还记得咱们Jfianl中的configJFinal()方法么?此次 咱们仍是须要看这个方法,不知道你们有没有主意到其中有一个方法叫作startPlugins()的方法,他的代码是这样写的

private static void startPlugins() {
	List<IPlugin> pluginList = plugins.getPluginList();
	if (pluginList != null) {
		for (IPlugin plugin : pluginList) {
			try {
				boolean success = plugin.start();
				if (!success) {
					String message = "Plugin start error: " + plugin.getClass().getName();
					log.error(message);
					throw new RuntimeException(message);
				}
			}
			catch (Exception e) {
				String message = "Plugin start error: " + plugin.getClass().getName() + ". \n" + e.getMessage();
				log.error(message, e);
				throw new RuntimeException(message, e);
			}
		}
	}
}

(大爷的,OSC的编辑器我终于会用了,看来之前的博文也该改改了)

看到了吧,这里显示定义个Pluginlist,而后只要这个Pluginlist中有加入的东西,那么咱们就能够看到他将会按照上述顺序的执行下去,而后请你们注意这个方式,plugin.start(),这里的plugin就是你本身的定义的Plugin也好,仍是Jfinal本身定义的Plugin也好。

What ever!!!

在这里,我想作的假设,就是假设每个Plugin中确定有一个start()的方法,而后,返回的值仍是True,不知道可否成立,咱们去代码中找找吧,希望假设是对的,上帝保佑,阿门!!

先看咱们C3p0的(C3p0Plugin):

public boolean start() {
	dataSource = new ComboPooledDataSource();
	dataSource.setJdbcUrl(jdbcUrl);
	dataSource.setUser(user);
	dataSource.setPassword(password);
	try {dataSource.setDriverClass(driverClass);}
	catch (PropertyVetoException e) {dataSource = null; System.err.println("C3p0Plugin start error"); throw new RuntimeException(e);} 
	dataSource.setMaxPoolSize(maxPoolSize);
	dataSource.setMinPoolSize(minPoolSize);
	dataSource.setInitialPoolSize(initialPoolSize);
	dataSource.setMaxIdleTime(maxIdleTime);
	dataSource.setAcquireIncrement(acquireIncrement);
	
	return true;
}

我说什么来着,对吧!!

在看看Spring的(SpringPlugin):

public boolean start() {
	if (ctx != null)
		IocInterceptor.ctx = ctx;
	else if (configurations != null)
		IocInterceptor.ctx = new FileSystemXmlApplicationContext(configurations);
	else
		IocInterceptor.ctx = new FileSystemXmlApplicationContext(PathKit.getWebRootPath() + "/WEB-INF/applicationContext.xml");
	return true;
}

看吧 ,个人印证快要被证明了;

Ehcache(Ehcacheplugin):

public boolean start() {
	createCacheManager();
	CacheKit.init(cacheManager);
	return true;
}

啥也不说了好吧,那么,之后你若是要想本身写一个Plugin的话,你该如何作?? 依葫芦画瓢么对吧,写出不来还抄不来了???

全部本身定义的Plugin去继承一个IPlugin接口么,而后在Start(),Stop()方法中写本身的东西就空了,就像这样:

public class DruidPlugin implements IPlugin, IDataSourceProvider {
    public boolean start() {
    ......
    }

    public boolean stop() {
.....
}

而后在你本身的Config中注册你的Plugin就行了啊,要问我在哪儿加Plugin啊,我必定会遥指大海的方向....

相关文章
相关标签/搜索