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啊,我必定會遙指大海的方向....

相關文章
相關標籤/搜索