2021SC@SDUSC
目录
一、jpress-core基本信息
1.pom.xml
jpress-core是JPress的核心代码。作为一个maven子项目,要研究Jpess-core的代码结构,先要了解其pom.xml文件,大概知道Jpess-core的基本信息,集成了什么框架,使用了什么依赖。
jpress-core的pom.xml文件如下:
<dependencies> <dependency> <groupId>io.jboot</groupId> <artifactId>jboot</artifactId> </dependency> <dependency> <groupId>com.jfinal</groupId> <artifactId>jfinal-weixin</artifactId> </dependency> <dependency> <groupId>io.jpress</groupId> <artifactId>jpress-model</artifactId> </dependency> <dependency> <groupId>io.jpress</groupId> <artifactId>jpress-service</artifactId> </dependency> <dependency> <groupId>io.jpress</groupId> <artifactId>jpress-commons</artifactId> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> </dependency> <!-- <dependency>--> <!-- <groupId>ch.qos.logback</groupId>--> <!-- <artifactId>logback-core</artifactId>--> <!-- </dependency>--> <!-- <dependency>--> <!-- <groupId>ch.qos.logback</groupId>--> <!-- <artifactId>logback-classic</artifactId>--> <!-- </dependency>--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency> <!-- <dependency>--> <!-- <groupId>net.sf.ehcache</groupId>--> <!-- <artifactId>ehcache</artifactId>--> <!-- </dependency>--> </dependencies>
可以看到,jpress主要依赖的框架为jboot、jfinal,用于web开发。其次是commons-io、jpress-commons两个工具类,以及jpress其他子模块jpress-service(JPress非业务 service 接口定义)、jpress-model(JPress非业务实体类)。
2.jpress-core目录
在io.jpress包下有两个文件夹——core、web,以及一个JPressCoreInitializer类Java文件。
JPressCoreInitializer为Jpress-core模块的初始化类。
core包和web包包含了其他核心的组件,是我们分析的主要代码。
二、JPressCoreInitializer
JBoot在启动时会扫描类路径中是否存在继承JbootAppListenerBase的类,如果有,则会初始化这个类,并执行其中的钩子方法,因此可以通过继承JbootAppListenerBase类实现启动任务。一个应用在可以存在多个继承至 JbootAppListenerBase 的类,这样更加方便团队配合和模块化开发,每个团队(或模块)都可以有自己的配置类,不会造成代码冲突。
jpress-core中的JPressCoreInitializer继承了JbootAppListenerBase类,而JbootAppListenerBase类实现了JbootAppListener接口。
JPressCoreInitializer最终重写了JbootAppListenerBase的以下方法:
//对应 JFinalConfig 的 configConstant public void onConstantConfig(Constants constants) ; //对应 JFinalConfig 的 configRoute public void onRouteConfig(Routes routes); //对应 JFinalConfig 的 configHandler public void onHandlerConfig(JfinalHandlers handlers) ; //对应 JFinalConfig 的 configEngine public void onEngineConfig(Engine engine); //对应 JFinalConfig 的 configInterceptor public void onInterceptorConfig(Interceptors interceptors) ; //对应 JFinalConfig 的 onStart() public void onStart() ;
可以发现,JPressCoreInitializer对应的就是JFinalConfig的配置类信息,从这里也可以看出,Jboot 是一个基于 JFinal的微服务框架。现在开始具体分析JPressCoreInitializer的各个具体实现方法。
1.onConstantConfig
此方法用来配置JFinal常量值,具体设置看以下注解
@Override public void onConstantConfig(Constants constants) { //对 render 的扩展与定制 constants.setRenderFactory(new JPressRenderFactory()); //配置验证码缓存 cache,配置成集*享缓存可以支持分布式与集群 constants.setCaptchaCache(new JbootCaptchaCache()); }
其中JPressRenderFactory对象为jpress-core包下的一个对象,其继承了JbootRenderFactory,重写了对错误页面渲染和对模板页面渲染的功能。
2.onRouteConfig
此方法用来配置访问路由,具体设置看以下注解
@Override public void onRouteConfig(Routes routes) { //配置是否在路由映射完成之后清除内部数据,以回收内存,默认值为true.设置为false通常用于在系统启动之后,仍然要使用 Routes 的场景,例如希望拿到Routes 生成用于控制访问权限的数据 routes.setClearAfterMapping(false); }
3.onHandlerConfig
此方法用来配置JFinal的Handler,如下代码配置了名为xxxHandler的处理器,Handler可以接管所有web请求,并对应用拥有完全的控制权,可以很方便地实现更高层的功能性扩展。
@Override public void onHandlerConfig(JfinalHandlers handlers) { //jpress安装处理器 handlers.add(new InstallHandler()); //网站地图处理器 handlers.add(new SitemapHandler()); //伪静态处理器 handlers.add(new JPressHandler()); // JPress 网站的 URL 管理器,主要是用于: //1、处理伪静态的问题 //2、处理扁平化 URL 的问题,也就是全站 URL 转为为 /xx-xx-1.html ,不再有 "/" 这个符号 ,更加有利于 SEO handlers.add(new FlatUrlHandler()); //插件处理器 handlers.add(new AddonHandlerProcesser()); //插件控制 handlers.setActionHandler(new AddonControllerProcesser()); }
4.onEngineConfig
此方法用来配置Template Engine
@Override public void onEngineConfig(Engine engine) { //向jfinal模板引擎中添加了jpress-core包下的静态方法 engine.addSharedStaticMethod(JPressCoreFunctions.class); }
5.onInterceptorConfig
configInterceptor 方法用来配置全局拦截器
@Override public void onInterceptorConfig(Interceptors interceptors) { //配置作用于jfinal控制层的全局拦截器 //utm拦截器 interceptors.add(new UTMInterceptor()); //Api拦截器 interceptors.add(new JPressInterceptor()); }
6.onStart
在 JFinalConfig 继承类中可以添加 onStart() ,JFinal 会在系统启动完成之后回调这个方法,让jpress的各种继承自JbootEventListener的管理器初始化,而每一个管理器的具体任务我们之后的博客再分析。
@Override public void onStart() { SitemapManager.me().init(); MenuManager.me().init(); WechatAddonManager.me().init(); AddonManager.me().init(); }