额...对不住各位,最近忙了点,博文么,没有及时更新,今天稍微有点时间,上来码码字,也算是放松了 前些时间,咱们主要看的事情关于初始化的那些个事情,其实细节不少,不过归纳一下也就如下的几点: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啊,我必定会遥指大海的方向....