JFinal源码分析------plugin的故事

额…对不住各位,最近忙了点,博文么,没有及时更新,今天稍微有点时间,上来码码字,也算是放松了
前些时间,我们主要看的事情关于初始化的那些个事情,其实细节很多,不过概括一下也就以下的几点:

1、容器从web.XML中加载JFinalFilter

2、JFinalFilter进行初始化,读取我们自己配置的configClass

3、在初始化的过程中分别从Constant中读取设置的常量,建立ActionMapping,加载数据库配置文件,创建MainRenderFactory(渲染视图的工厂类),执行我们自定义的那个Config类,执行里面继承的方法

4、等待URL访问执行

基本上有着四个步骤,初始化的工作基本算是完了!(当然,很多细节。各位看官请看源码,这里的细节很多)

当我们完成了初始化工作以后,在进行URL访问的时候,基本上就是ActionMapping的职责范围了,在这个范围里面,就可以开始我们真正的业务编写了,鉴于应用的复杂程度,我们可以分别在Contrllor中编写(简单的CRUD),如果牵扯到很复杂的业务是时候,我们可以抽一个层,至于名字叫什么,自己想吧,这个每个公司都有不同的叫法,好了扯多了,今天主要试看看我们一些Plugin的东西

在Plugin中了,JFinal继承了一下几个东西:

1、ActiveRecord(这个用的应该蛮多的,Demo里面你继承的那个Model就是从这里面来的)

2、C3p0(数据库的连接池么,Demo里面应该也是能够看到他的身影的)

3、Druid(淘宝的一个连接池,据目测很强大,具体有多强大,看看淘宝就应该知道了吧)

4、Ehcache(JAVA注明的缓存框架,一看就知道这个东西是做缓存的)

5、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啊,我一定会遥指大海的方向….

你可能感兴趣的:(plugin,Stop,start,jFinal)