jfinal北京-赛车网站源码搭建研究之核心组件Plugin

相比较北京-赛车网站源码搭建于其他核心组件,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拥有非常强大的灵活性来满足各种项目上的自定义需求。

猜你喜欢

转载自blog.51cto.com/13873739/2145195