額...對不住各位,最近忙了點,博文麼,沒有及時更新,今天稍微有點時間,上來碼碼字,也算是放鬆了 前些時間,咱們主要看的事情關於初始化的那些個事情,其實細節不少,不過歸納一下也就如下的幾點: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啊,我必定會遙指大海的方向....