作者:龚清  历史版本:1  最后编辑:龚清  更新时间:2024-11-20 15:42

编写版本:v3.5.3
适用版本:所有

代码调用规范

概述

了解IBPS代码分层调用,更快地进行代码开发。在开始接触IBPS代码前,请先阅读本文档。如果对于IBPS-V3微服务代码层次不清楚的,请看这里

简述:架构主要分为三层:接口层、服务层以及资源层。后端具体的代码调用围绕着服务层以及资源层展开。本文档会从资源层开始,到服务层简述代码的分层调用。

资源层

简述:资源层在代码中主要由SQL Map XML映射文件、缓存、文件存储组成。这里主要描述在IBPS中的映射文件的相关运用。

实体对象和映射文件

各个模块的映射文件都在其对应的模块model文件夹中,以下以骨架项目(skeleton-model)为例。

从图上可以看到映射文件对应的实体对象PO和表对象TBL。

注意:
(1)PO在IBPS中为实体对象,其继承表对象,即PO对象是表对象的子类。
(2)表对象(TBL)继承抽象PO,其对应着数据库表。表对象的一个属性与表的每一个字段相对应。

PO在映射文件中的使用

映射文件的resultMap为其对应的PO,用于控制数据如何从结果集中取出,以及哪一个属性匹配哪一个字段。详细的SQL语句使用参照骨架项目和抽象PO。

服务层

简述:服务层初看较为复杂,但仔细了解后并不复杂,这样。较之原有的DAO层,IBPS将数据操作的读写分开,分为DAO(增删改)和QueryDao(查询)。在二者之上,又分别封装为Domain(领域)和Repository(仓库)。RestController通过调用领域和仓库实现对应的服务逻辑。至于FeignClient,IBPS3框架中使用feign作为RPC远程调用框架,在此暂且不表。

Dao和QueryDao

各个模块的Dao和QueryDao文件都在其对应模块biz文件中。下面以骨架项目(skeleton-biz)为例。

图中红框的为QueryDao和Dao接口类及其实现类。QueryDao和Dao接口类分别继承对应的查询接口类(IQueryDao)和增删改的接口类(IDao)即可。实现类同理,详情参考骨架项目。

注意:
(1)在对应的接口类里做相应操作,比如在QueryDao中只做查询,不要混淆。
(2)QueryDao和Dao实现类都需要重写命名空间方法,返回对应PO类的名称。
(3)操作时调用抽象类的方法,注意格式。

Domain和Repository

各个模块的Domain和Repository文件都在其对应模块biz文件中。下面以骨架项目(skeleton-biz)为例。Domain在传统框架里可看作为业务层(Service层),Repository可以看做持久层(DAO层)。

图中红框为Domain、Repository及其实现类。Domain和Repository分别继承对应的抽象领域驱动类(AbstractDomain)和抽象仓库(IRepository)即可。代码详情参考骨架项目。

Domain(领域驱动类)和Repository(查询仓库类)的使用:
(1)重写方法。部分方法按照项目需求重写,比如getInternalCacheName(),不需要设置缓存的数据请不要重写。
(2)Domain内进行数据的增删改,具体的数据处理可以在此处完成。在数据操作过程中,可以引入Repository或QueryDao进行必要的查询,也可以引入Service调用其他服务。Repository查询同理。

(3)为了性能或日志等功能的拓展,建议使用继承的抽象的create(P p)等方法实现数据的增删改。想实现各操作的前后置操作,请重写对应的方法。

RestController(Provider)

各个模块的Provider文件都在其对应模块provide-xxxx的provider文件中,provider对应的service(api)在provide-xxxx-api中。下面以骨架项目(skeleton)为例。

图中红框为骨架服务的provider。主要的服务接口实现在此处,继承通用服务(GenericProvider)。引入Domain和Repository完成相应的数据操作,具体代码请参考骨架项目。

provider的使用建议:
(1)建议使用统一响应对象(APIResult)返回数据。
(2)使用@ApiOperation等注解,添加注释。
(3)注意事务控制。

图中蓝框为骨架服务的service。主要的接口也是在此定义。
service的使用建议:
(1)指定映射的URL、设置请求方法等等。
(2)注意使用校验注解。

FeignClient

各模块的服务间相互调用是通过FeignClient实现的。通过client就可以实现服务间的相互调用。

该模块的client类需要继承其对应的service类。下图以骨架服务的client为例。
需要在类上添加对应的@FeignClient注解。