一个基于Spring Boot的项目框架,更少的轮子!

云栖息地编号信息:[点击查看更多行业信息]

在这里,您可以找到来自不同行业的第一手云信息。你还在等什么?来吧。

前言

最近,Spring Boot已经被用来与MyBatis、通用的Mapper插件和PageHelper分页插件在几个中小型API项目中合作。在这样做之后,我认为用这套框架和工具来开发这种项目真的很舒服,团队的反应也很好。在项目的建设和发展过程中,我也总结了一些小经验,并与大家分享。

在开发一个API项目之前,不言而喻,构建项目、引入依赖关系和配置框架的基本任务是自然的。通常,为了加快项目的开发进度(提前回家),需要封装一些常用的类和工具,如统一响应结果封装、统一异常处理、接口签名认证、基本添加、删除、修改和差异方法封装、基本代码生成工具等。只有有了这些项目,项目才能启动。

但是,下次完成类似的项目时,可能需要重复上述步骤。虽然它通常被接管和改变,但仍然是浪费时间。因此,面向对象的抽象和封装的思想可以用来提取这些项目的共同点,并将它们封装到一个种子项目中(据估计,大多数公司将会有许多类似的种子项目)。这样,下次开发类似的项目并直接迭代种子项目就足够了,从而减少了无意义的重复工作。

在相关项目上线后,我花了一些时间来简化种子项目,并且已经与GitHub共享了该项目。如果你准备做类似的项目,你可以试着克隆它。

一个基于Spring  Boot的项目框架,更少的轮子!

如果你发现问题或有任何好的建议,请询问问题或公关一起改进。

特征提供

最佳实践项目结构、配置文件、简化的项目管理

一个基于Spring  Boot的项目框架,更少的轮子!

统一的响应结果封装和生成工具

/**

*统一的应用编程接口响应结果包

*/

公共类结果

私有int代码;

私有字符串消息;

私有对象数据;

公共结果集代码(结果代码结果代码){

this . code=ResultCode . code

归还这个;

}

//省略getter和setter方法

}

/**

*响应代码枚举,参考HTTP状态代码的语义

*/

公共枚举结果代码{

成功(200),//成功

失败(400),//失败

未自动化(401),//未认证(签名错误)

找不到(404),//接口不存在

内部_服务器_错误(500);//服务器内部错误

公共int代码;

结果代码(内部代码){

this.code=code

}

}

/**

*响应结果生成工具

*/

公共类结果生成器{

私有静态最终字符串DEFAULT _ SUCCESS _ MEssage= ' SUCCESS ';

公共静态结果genSuccessResult() {

返回新结果()。设置代码(结果代码。成功)。设置消息(DEFAULT _ SUCCESS _ MEssage);

}

公共静态结果生成成功结果(对象数据){

返回新结果()。设置代码(结果代码。成功)。设置消息(DEFAULT_SUCCESS_MESSAGE)。setData(数据);

}

公共静态结果生成失败结果(字符串消息){

返回新结果()。设置代码(结果代码。失败)。setMessage(消息);

}

}

统一异常处理

公共void ConfigureHandlerExceptionResolver(ListHandlerExceptionResolver ExceptionResolver){

exceptionResolvers . add(new HandlerExceptionResolver(){

公共模型和视图解析异常(HttpServletRequest请求,HttpServletResponse响应,对象处理程序,异常e) {

结果结果=新结果();

如果(serviceexception的实例){//业务失败的异常,例如“错误的帐户或密码”

result.setCode(结果代码。失败)。setMessage(e . GetMessage());

logger . info(e . GetMessage());

}否则如果(例如NoHandlerFoundException) {

results . set code(result code . not _ found)。setmessage( ' interface[' request . getrequesturi()']不存在 ');

}否则如果(例如ServletException) {

result.setCode(结果代码。失败)。setMessage(e . GetMessage());

}其他{

结果。setcode(结果代码。内部服务器错误)。setmessage( ' interface[' request . GetRequestUri() ']内部错误,请联系管理员 ');

字符串消息;

if(handler instance of handler method){

句柄方法句柄方法=(HandlerMethod)句柄;

消息=字符串。格式( '接口[%s]出现异常,方法:%s.%s,异常摘要:%s ',

request.getRequestURI(),

handlerMethod.getBean().getClass().getName(),

handlerMethod.getMethod().getName(),

e .GetMessage());

}其他{

message=e . GetMessage();

}

logger.error(消息,e);

}

响应结果(响应,结果);

返回新模型和视图();

}

});

}

常用基础方法抽象封装

公共接口服务

无效保存(T型);//持久化

无效保存(列表模型);//批量持久化

void deleteById(整数id);//通过主鍵刪除

void deleteByIds(字符串ids//批量刪除例如:ids - "1,2,3,4 "

空洞更新(T型);//更新

T findById(整数id);//通过编号查找

查找方式(字符串字段名,对象值)抛出TooManyResultsException//通过模型中某个成员变量名称(非数据表中圆柱的名称)查找,值需符合独一无二的约束

列表查找标识(字符串标识);//通过多个编号查找//eg:ids - "1,2,3,4 "

列表查找条件(条件条件);//根据条件查找

列表查找全部();//获取所有

}

提供代码生成器来生成基础代码

公共抽象类代码生成器{

.

公共静态空主要(字符串[)参数){

genCode( '输入表名 ');

}

公共静态无效生成代码(字符串.表名){

用于(字符串表名:表名){

//根据需求生成,不需要的注掉,模板有问题的话可以自己修改。

genModelAndMapper(表名);

发电服务(表名);

通用控制器(表名);

}

}

.

}

代码生成器可根据表名生成对应的模型、映射器、映射XML、服务、服务接口、控制器(默认提供开机自检和安静的两套控制器模板,根据需要在通用控制器(表名)方法中自己选择,默认是纯开机自检的),代码模板可根据实际项目的需求来定制,以便渐少重复劳动。

由于每个公司业务都不太一样,所以只提供了一些简单的通用方法模板,主要是提供一个思路来减少重复代码的编写。在我们公司的实际使用中,其实根据业务的抽象编写了大量的代码模板。扩展用户用户:优秀的代码都是如何分层的?

提供简单的接口签名认证

公共无效的附加接收器(截取注册注册表){

//接口签名认证拦截器,该签名认证比较简单,实际项目中可以使用Json网络令牌或其他更好的方式替代。

如果(!'dev ' .等于(环境)){ //开发环境忽略签名认证

注册表。addinterceptor(新HandlerInterceptorAdapter(){

@覆盖

公共布尔预句柄(HttpServletRequest请求,HttpServletResponse响应,对象处理程序)引发异常{

//验证签名

布尔传递=有效符号(请求);

如果(通过)

返回真;

}其他{

logger.warn( '签名认证失败,请求接口:{},请求知识产权:{},请求参数:{} ',

request.getRequestURI(),GetPaddress(request),JSON。到字符串(请求。getParameterMap());

结果结果=新结果();

result.setCode(结果代码。未经授权).setMessage( s)签名认证失败 ');

响应结果(响应,结果);

返回错误的

}

}

});

}

}

/**

*一个简单的签名认证,规则用户用户:

* 1 .将请求参数按美国信息交换标准码码排序

* 2 .拼接为a=值b=值.这样的字符串(不包含标志)

* 3 .混合密钥(秘密)进行讯息摘要5获得签名,与请求的签名进行比较

*/

私有布尔验证签名(HttpserVletrequest请求){

字符串RequestSign=请求。GetParameter( '符号 ');//获得请求签名,如符号=19e 907700 db7 ad 91318424 a 97 c 54 ed 57

if(StringItls。ISempty(RequestSign)){

返回错误的

}

列表字符串键=新的数组字符串(request.getParameterMap().密钥集();

钥匙。移除( ' sign ');//排除符号参数

Collections .排序(键);//排序

StringBuilder sb=新的StringBuilder();

用于(字符串键:键){

追加(钥匙).追加('= ').追加(request.getParameter(键)).追加( ' ');//拼接字符串

}

字符串链接字符串某人。ToString();

链接字符串=字符串。子字符串(链接字符串,0,链接字符串。长度()-1);//去除最后一个' '

字符串机密= '马铃薯 '。//密钥,自己修改

字符串符号=DigestUtils.md5Hex(链接字符串机密);//混合密钥md5

返回StringUtils.equals(符号,RequestSign);//比较

}

集成MyBatis、通用映射器插件、页面助手分页插件实现单表业务零SQL

使用Druid Spring启动程序集成Druid数据库连接池和监控

利用FastJsonHttpMessageConverter提高JSON序列化速度

技术选型文档

一个基于Spring  Boot的项目框架,更少的轮子!

[云起在线教室]产品和技术专家每天分享!

课程地址:https://yqh.aliyun.com/live

立即加入社区,与专家面对面,并了解课程的最新进展!

[云栖在线课堂社区]https://c.tb.cn/F3.Z8gvnK

发布者:2020-04-14

作者:简单土豆

本文来源于“互联网建筑师微信公众号”。如果你知道相关信息,你可以关注“互联网建筑师”