JFinal源码分析------初始化那些事儿

JFinal使用配置: 在web.xml中配置信息一下的信息 <filter> <filter-name>jfinal</filter-name> <filter-class>com.JFinal.core.JFinalFilter</filter-class> <init-param> <param-name>configClass</param-name> <param-value>com.mysite.common.DemoConfig</param-value> </init-param> </filter> <filter-mapping> <filter-name>jfinal</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>java

为何要这么设置??? 其实JFinal中这样设置并没有道理,由于这个用来实际上是Filter,就像之前咱们设置自定义Filter的方式是同样的,这样设置用户,当容器运行的时候就,这个Filter就会被加载,而后依次会执行intit(),doFilter(),destroy()的方法,至于init(),doFilter(),destroy()方法何时执行,为何会执行,已经超出了咱们这个研究的课题,有需求的程序员们本身去Google吧程序员

JFinalFilter 是什么? 今天咱们看的文件时一个叫JFinalFilter.java的文件,其中关键的代码是这样的: 首先看这个类的定义:web

public final class JFinalFilter implements Filter{   ..... }app

JFinalFilter 的init()方法 很明显,他继承了一个Filter,说明JFinalFilter,明眼人一看都知道这个确定也是一个Filter啊。咱们知道,Filter再被加载的时候会首先进入一个init()的方法,JFinal中这个方法中有一下的几点,看代码:框架

String initParam = filterConfig.getInitParameter("configClass");函数

这一句是用来加载web.xml中初始化参数的”configClass”的值,这也就是为何要在Web.xml中设置url

<init-param> <param-name>configClass</param-name> <param-value>com.mysite.common.DemoConfig</param-value> </init-param>日志

这个参数的最根本的缘由,有人若是不明白 那咱们继续看。 createJFinalConfig(initParam)干些啥? 在这个方法中有一个叫createJFinalConfig(initParam)的方法,看方法名就知道这个确定是用来建立JFinalConfig对象的一个方法啊,对吧,因此咱们要看看里面发生了些什么? 首先 先看看configClass 是否存在,若是不存在的话,就给出异常提示,抛出的异常是这样code

throw new RuntimeException("Please set configClass parameter of JFinalFilter in web.xml"); 因此看到这个信息,你的xml中没有配置configClass这个参数了xml

好了 当咱们正确的配置了xml中的信息以后,重点的来了

Object temp = Class.forName(configClass).newInstance();

这个很明显是经过这个反射来动态的建立一个实例,这个实例的类型是一个Object,至于为何会这样,不太清楚,没有关系,看看后面的就大概会清楚了

if (temp instanceof JFinalConfig){ jfinalConfig = (JFinalConfig)temp; } else{ throw new RuntimeException("Can not create instance of class: " + configClass + ". Please check the config in web.xml"); }

这个就是判断是否是一个JFianlConfig的对象实例,若是是的话,就将他转型成为JFinalConfig对象,若是不是,就抛出异常信息。

好了 到这里 须要插几句题外话,说几个问题:

为何咱们须要设置一个类专门要继承JfinalConfig? 答案就是咱们刚刚说到的那个判断,判断咱们动态生成的那个对象实例,是否是JfinalConfig对象的实例,因此咱们须要有一个类来继承JFinalConfig类(固然,这只是其中的一个缘由),还有其余的缘由就是,当你继承了这个JfianlConfig类之后,会让你重载一些个方法(configConstant(),configHandler(),configInterceptor(),configPlugin(),configRoute())这些个方法,在JfinalFilter的初始化过程当中是被执行的,因此咱们必需要有一个类来专门继承这个JfinalConfig类,也就是咱们要专门在xml重要给只文章开始时候的那些配置

好了 继续刚刚的话题,如今咱们已经有了这个jfinalConfig对象实例了,下面看看该作什么了!! 对了 下面就是该初始化话一些和JFinal框架相关的东西了

jfinal.init(jfinalConfig,filterConfig.getServletContext()) 在这个这个方法中主要又有如下的步骤: initPathUtil();//这个就是初始化项目的路径,至于为何要这样暂时没有弄明白 Config.configJFinal(jfinalConfig); initLoggerFactory();//这个是日志相关的,说白了就是为了使用了Log4j的时候而准备的 四、一下的方法也是在咱们自定义的Config类中的方法,也会在初始化的时候被执行 jfinalConfig.configRoute(routes); jfinalConfig.configPlugin(plugins); startPlugins(); jfinalConfig.configInterceptor(interceptors); jfinalConfig.configHandler(handlers);

五、 initActionMapping();//初始化请求地址映射 initHandler(); initRender(); initOreillyCos(); initI18n(); initTokenManager();

以上的方法也是主要作初始化工做

分开说 Config.configJFinal(jfinalConfig); 先看看这个函数干了什么 进入到这个里面,咱们看看到了如下的代码:

jfinalConfig.configConstant(constants);//配置常量信息				
	initLoggerFactory();
	jfinalConfig.configRoute(routes);
	jfinalConfig.configPlugin(plugins);					
	startPlugins();	// very important!!!
	jfinalConfig.configInterceptor(interceptors);
	jfinalConfig.configHandler(handlers);

这个JfinalConfig就是咱们本身定义的那个config,这个里面的方法就是咱们复写的那些个方法,也就是说明在初始化的时候,经过JFinalConfig对象就执行到了咱们自定的那些个方法中,其实咱们在追一下的话就应该知道,他是怎么作的,在JfinalConfig中,这些个方法都是抽象方法,这是须要咱们本身去实现的,这就是一框架的思想,全部关于具体实现的东西都交给实现的人去作,具体作什么根本就不会关心,经过了Config.configJFinal(jfinalConfig);就彻底将咱们自定义的东西给执行了

回到JfianlFilter 而后咱们回到JfianlFilter中, handler = jfinal.getHandler(); constants = Config.getConstants(); encoding = constants.getEncoding(); jfinalConfig.afterJFinalStart(); String contextPath = filterConfig.getServletContext().getContextPath(); contextPathLength = (contextPath == null || "/".equals(contextPath) ? 0 : contextPath.length()); System.out.println(contextPathLength);

这些主要就是写常量或者之类的设置了 当这些个完成之后,整个初始化大概的过程就完成了,其余的这个过程当中主要还有不少细节,须要慢慢的分析,下次再吹

相关文章
相关标签/搜索