1. 程式人生 > >jfinal北京-賽車網站源碼搭建研究之核心組件Plugin

jfinal北京-賽車網站源碼搭建研究之核心組件Plugin

tween idp record 設計思路 provider inter ace .data 需要

相比較北京-賽車網站源碼搭建於其他核心組件,jfinal對Plugin的處理可謂是相當簡潔了。這一點從Plugin組件的核心接口IPlugin的定義中可見一斑。

  1. 定義

/**

  • IPlugin
    */
    public interface IPlugin {
    boolean start();
    boolean stop();
    }

    1
    2
    3
    4
    5
    6
    7

    對於Plugin,jfinal給予了足夠的地位——頂級packagecom.jfinal.plugin。
    需要註意到的一點就是plugin機制中,jfinal在其中只負責plugin的啟動和停止,具體的實現邏輯,以及plugin的應用則是完全交由外界來自主決定。
    另外觀察com.jfinal.plugin包結構也能察覺出jfinal對plugin的組織方式以及設計思路。而且從這個package結構也可以看出,一般的項目基本上也就這麽幾個需求。(其中auth中還沒有完成,看思路應該是自定義Session的構建)。

    package結構

  1. 繼承鏈

看完了定義,接下來我們按照之前的習慣來看看Plugin的繼承鏈體系。
繼承鏈
3.1 ActiveRecordPlugin

作為 JFinal 最核心的組成部分之一的ActiveRecord 正是由這個Plugin啟動的,重要性就不言而喻了。

public boolean start() {
if (isStarted) {
return true;
}
// 配置數據源
if (config.dataSource == null && dataSourceProvider != null) {
config.dataSource = dataSourceProvider.getDataSource();

}
if (config.dataSource == null) {
throw new RuntimeException("ActiveRecord start error: ActiveRecordPlugin need DataSource or DataSourceProvider");
}
// 解析jfinal 3.0起加入的sql 管理模塊
config.sqlKit.parseSqlTemplate();
// build the mapping of model between class and table
new TableBuilder().build(tableList, config);
DbKit.addConfig(config);
isStarted = true;
// 返回true, 告知jfinal本Plugin啟動成功
return true;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

3.2 C3p0Plugin / DruidPlugin / HikariCpPlugin

把這三個Plugin都是數據庫連接池工具。核心邏輯就是DataSource實例的構建。
3.3 EhCachePlugin/ RedisPlugin

緩存實現。
3.3 Cron4jPlugin

定時任務實現。本類上的官方文檔上有詳細的使用說明,使用者都不用百度了。

  1. 生命周期

最後讓我們看看plugin是如何融入jfinal的生命周期中的。
4.1 啟動

JFinalFilter.init

> JFinal.init
> Config.configJFinal(jfinalConfig)
> Config.configPluginWithOrder(1, jfinalConfig);
> Config.startPlugins(); 【jfinal會依據用戶配置(constants.setConfigPluginOrder()),在不同的 JFinalConfig.configXxxx之前啟動Plugin。】

1
2
3
4
5

4.2 停止

JFinalFilter.destroy

> jfinal.stopPlugins()

1
2
  1. 總結

jfinal在框架層面對於Plugin的處理,只負責回調plugin的啟動和停止;具體的實現邏輯,以及plugin的應用則是完全交由外界來完成。

極少的強制契約,使得Plugin擁有非常強大的靈活性來滿足各種項目上的自定義需求。

jfinal北京-賽車網站源碼搭建研究之核心組件Plugin