额…对不住各位,最近忙了点,博文么,没有及时更新,今天稍微有点时间,上来码码字,也算是放松了
前些时间,我们主要看的事情关于初始化的那些个事情,其实细节很多,不过概括一下也就以下的几点:
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啊,我一定会遥指大海的方向….