jfinal北京-賽車網站源碼搭建研究之核心組件Plugin
- 定義
/**
-
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的構建)。
- 繼承鏈
看完了定義,接下來我們按照之前的習慣來看看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);
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
定時任務實現。本類上的官方文檔上有詳細的使用說明,使用者都不用百度了。
- 生命周期
最後讓我們看看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
- 總結
jfinal在框架層面對於Plugin的處理,只負責回調plugin的啟動和停止;具體的實現邏輯,以及plugin的應用則是完全交由外界來完成。
極少的強制契約,使得Plugin擁有非常強大的靈活性來滿足各種項目上的自定義需求。
jfinal北京-賽車網站源碼搭建研究之核心組件Plugin