【jpress】jpress-core架构

2021SC@SDUSC


目录

一、jpress-core基本信息

1.pom.xml

2.jpress-core目录

二、JPressCoreInitializer

1.onConstantConfig

2.onRouteConfig

3.onHandlerConfig

4.onEngineConfig

5.onInterceptorConfig

6.onStart

 


一、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();
​
}
上一篇:WEB站点部署


下一篇:Docker部署jpress