javaweb開發框架,SpringBoot實踐(三十二):5分鐘搭建springboot單體應用開發框架

 2023-12-06 阅读 33 评论 0

摘要:熟悉語言和開發工具上基礎快速使用框架構建應用是個機械工作,5分鐘完成開發準備工作,沒有冗余動作。 目錄 準備工作? 開發框架搭建 ?spring初始化 ?常規依賴 ??其他依賴 規范化開發 目錄結構 依賴適配 代碼生成器 響應體封裝 github代碼 準備工作? 后端開發需要

熟悉語言和開發工具上基礎快速使用框架構建應用是個機械工作,5分鐘完成開發準備工作,沒有冗余動作。

目錄

準備工作?

開發框架搭建

?spring初始化

?常規依賴

??其他依賴

規范化開發

目錄結構

依賴適配

代碼生成器

響應體封裝

github代碼


準備工作?

后端開發需要數據持久化,數據庫使用mysql,這也是生產環境大部分的選擇,本地開發如果沒有mysql可以直接在idea上創建h2數據庫,具體創建方式可以參考:使用IDEA創建H2數據庫_斷浮的博客-CSDN博客_idea配置h2數據庫

開發框架搭建

?spring初始化

javaweb開發框架。https://start.spring.com?這個地址實際中不快,改用https://start.aliyun.com?,選擇它好處是:依賴選擇時分類,非常的詳細,而且生成的maven-pom文件有版本管理(基于統一的spring-boot版本號基礎上擴展其他依賴包),不然需要自己分類管理,并且生成的項目中yaml有注釋。

?常規依賴

往下走選擇這幾個組件,作用分別是:

spring web,最主要的依賴,基于spring的web后端開發所有包都會自動引用

mysql driver 是mysql驅動,如果沒有本地mysql,可以使用h2,idea可以創建h2

SpringBoot項目,spring configuration-processor 依賴寫配置文件會有提示;

lombok 完成自動getter setter 還有hashcode等類處理功能;

spring-boot-devtools? 能提供熱部署能力;

mybatis-plus 完成dao層處理,在mybatis基礎上優化,極大簡化數據庫操作;

java項目框架搭建流程?freemarker模板引擎用于mybaits-plus自動代碼生成器,默認是velocity

security用于登錄相關用戶驗證和鑒權;

Fastjson和commons lang進行是基本的處理包;

??其他依賴

bootstrap框架搭建,在此基礎上增加其他依賴的準則是提高開發效率,讓工具更加趁手,根據開發經驗最好集成以下幾個輔助工具:

swagger2和swagger-ui,兩個都必須加,用戶接口的梳理和規范化;

swagger-boostrap-ui,一個國產的api管理工具,界面更友好;

mybatis-plus-join,mybatis plus的一個多表關聯插件,在寫多表查詢很簡單;

mybatis-plus-generator,mybatis-plus的代碼生成器;

mybatis-plus-extension,mybatis的分頁擴展;

因為我們上面選擇的spring-boot的2.3.7,其他依賴是我們手動要增加的,直接在pom中增加:

       <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.4.0</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.4.0</version></dependency><dependency><groupId>com.github.yulichang</groupId><artifactId>mybatis-plus-join</artifactId><version>1.2.2</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.3.1</version></dependency><dependency><groupId>com.github.xiaoymin</groupId><artifactId>swagger-bootstrap-ui</artifactId><version>1.9.5</version></dependency><!--velocity模板引擎--><dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.3</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-extension</artifactId><version>3.4.2</version></dependency>

到此為止,直接在主類DemoApplication.class上ctrl+shift+F10就可以運行這個工程了,如果不糾結后續的開發標準化,那么框架搭建就結束了。純粹的后端開發是很簡單的,如果在別人規劃基礎上搞開發,就是機械的寫方法和實現。

規范化開發

完成搭建和使用還是有很大距離的,目前為止我們沒有開發1行代碼,工程卻可以運行,但必然不是我們想要的運行方式和結果,依賴也沒有真正地發揮作用,每個包的使用需要學習成本,比如security集成進來后會為我們分配用戶名和密碼,如果不進行修改和適配,接口會被攔截,swagger2需要進行攔截器配置才可以自動掃描接口,mybatis的代碼生成器也需要進行個性化配置,此部分都可以定義為規范化開發工作。

目錄結構

目錄規劃目的是代碼管理層面的統一,這個是所有使用的基礎:

client:第三方集成和調用,一般用feign

config:放攔截器比如security,mybatis和swagger都是對Http請求的攔截和處理;

controller:請求的入口

entity:POJO類,建議跟數據庫對象一一對應,使用mybatis-plus可以綁定表,非常方便;

framework:次級管理目錄,將其他異常,常量,請求體,響應體封裝統一放置管理;

mapper:數據庫操作的mapper存放位置;

service:請求的實現方法;

utils:工具類,這個地方會存很多通用和專用的工具;

VO:面向展示層的封裝體;

?

依賴適配

目錄規劃好后,就要進行依賴適配,因為增加的幾個依賴包都有各自的最佳實踐或者正確使用姿勢,具體而言就是security,mybatis-plus和swagger2的攔截配置,security因為要重寫很多方法,這里先不詳細介紹,可以直接在xml里面配置其登錄名和密碼,登錄后進行其他依賴配置。

spring.security.user.name=root

spring.security.user.password=123456

關于security框架本身其復雜度高,后續可以參考之前的博客做完整適配:SpringBoot實踐(二十六):Security實現Vue-Element-Admin登錄攔截(適合單體應用)_A葉子葉的博客-CSDN博客_springsecurity路由攔截

mybatis有分頁器和自動填充的配置要自定義,這里也可以不寫;swagger2和最定義UI需要進行配置才會生效,swagger2的配置類:

@Configuration
@EnableSwagger2
public class Swagger2 {// 配置掃描的包@Beanpublic Docket createRestApi() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select().apis(RequestHandlerSelectors.basePackage("com.quick.start.demo.controller")).paths(PathSelectors.any()).build();}private ApiInfo apiInfo() {return new ApiInfoBuilder().title("測試Swagger的API.")// 創建人信息.contact(new Contact("yzg",  "https://blog.csdn.net/yezonggang",  "717818895@qq.com"))// 版本號.version("2.0")// 描述.description("描述").build();}
}

http://localhost:8089/swagger-ui.html

http://localhost:8089/doc.html

兩個UI界面的對比如下:?

代碼生成器

mybatis-plus代碼生成器單獨講因為這個工具能夠節省很多時間,在進行項目開發前關系庫應該首先被設計出來,也就是表結構,按照范式要求進行設計后代碼開發,表對應entity,mapper映射和實現類都可以被mp標準化輸出;

package com.quick.start.demo;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;class CodeGeneratorTest {public static final String FILE_NAME_MODEL = "%sEntity";public static String scanner(String tip) {Scanner scanner = new Scanner(System.in);StringBuilder help = new StringBuilder();help.append("請輸入" + tip + ":");System.out.println(help.toString());if (scanner.hasNext()) {String ipt = scanner.next();if (StringUtils.isNotBlank(ipt)) {return ipt;}}throw new MybatisPlusException("請輸入正確的" + tip + "!");}public static void main(String[] args) {// 代碼生成器AutoGenerator mpg = new AutoGenerator();// 全局配置GlobalConfig gc = new GlobalConfig();// 不改String projectPath = System.getProperty("user.dir");gc.setOutputDir(projectPath + "/src/main/java");gc.setAuthor("yzg");gc.setOpen(false);// 支持swagger2gc.setSwagger2(true);// pojo類后接Entitygc.setEntityName("%sEntity");gc.setFileOverride(true);gc.setEnableCache(true);mpg.setGlobalConfig(gc);// 數據源配置DataSourceConfig dsc = new DataSourceConfig();dsc.setUrl("jdbc:mysql://10.10.10.10:3306/security?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8");dsc.setSchemaName("security");dsc.setDbType(DbType.MYSQL);dsc.setDriverName("com.mysql.cj.jdbc.Driver");dsc.setUsername("root");dsc.setPassword("1q2w!Q@W");mpg.setDataSource(dsc);// 包配置PackageConfig pc = new PackageConfig();//pc.setModuleName(scanner("模塊名"));pc.setParent("com.quick.start.demo");mpg.setPackageInfo(pc);// 自定義配置InjectionConfig cfg = new InjectionConfig() {@Overridepublic void initMap() {// to do nothing}};// 如果模板引擎是 freemarkerString templatePath = "/templates/mapper.xml.ftl";// 如果模板引擎是 velocity//String templatePath = "/templates/mapper.xml.vm";// 自定義輸出配置List<FileOutConfig> focList = new ArrayList<>();// 自定義配置會被優先輸出focList.add(new FileOutConfig(templatePath) {@Overridepublic String outputFile(TableInfo tableInfo) {// 自定義輸出文件名 , 如果你 Entity 設置了前后綴、此處注意 xml 的名稱會跟著發生變化!!return projectPath + "/src/main/resources/mapper/"+ "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;}});cfg.setFileOutConfigList(focList);mpg.setCfg(cfg);// 配置模板TemplateConfig templateConfig = new TemplateConfig();templateConfig.setXml(null);mpg.setTemplate(templateConfig);// 策略配置StrategyConfig strategy = new StrategyConfig();strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略strategy.setColumnNaming(NamingStrategy.underline_to_camel);//strategy.setSuperEntityClass("你自己的父類實體,沒有就不用設置!");strategy.setEntityLombokModel(true);strategy.setRestControllerStyle(true);// 公共父類//strategy.setSuperControllerClass("你自己的父類控制器,沒有就不用設置!");// 寫于父類中的公共字段//strategy.setSuperEntityColumns("id");//strategy.setInclude(scanner("表名,多個英文逗號分割").split(","));strategy.setControllerMappingHyphenStyle(true);// 根據表名的_下劃線命名成類名strategy.setTablePrefix(pc.getModuleName() + "_");strategy.setInclude("role"); // 需要生成的表//strategy.setExclude(new String[]{"test"}); // 排除生成的表// 開啟tableFileld就是表名對應關系strategy.setEntityTableFieldAnnotationEnable(true);//strategy.setTablePrefix(new String[] { "SYS_" });// 此處可以修改為您的表前綴strategy.setEntityLombokModel(true);//strategy.setCapitalMode(true);// 全局大寫命名 ORACLE 注意strategy.setEnableSqlFilter(true);mpg.setStrategy(strategy);mpg.setTemplateEngine(new FreemarkerTemplateEngine());mpg.execute();}}

代碼自動化生成,非常地便利:?

?以RoleEntity.class為例:

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("role")
@ApiModel(value="RoleEntity對象", description="")
public class RoleEntity implements Serializable {private static final long serialVersionUID = 1L;@TableId(value = "id", type = IdType.AUTO)private Long id;@TableField("name")private String name;@TableField("code")private String code;@TableField("des")private String des;}

響應體封裝

響應體建議要封裝一層,因為直接返回dataHttpServletResponse是不符合生產規范的,提前捕獲,定義,返回正常或有問題的數據才是規范的;

@Data
@NoArgsConstructor
public class ResponseData implements Serializable {private final static String SUCCESS = "success";private final static String ERROR = "error";private final static String WARN = "warn";private  int code;private  String msg ;private  Object data;public ResponseData(int code, String msg, Object data) {this.code = code;this.msg = msg;this.data = data;}public ResponseData(String msg, Object data) {this.msg = msg;this.data = data;}public static ResponseData success(Object data){return new ResponseData(200,SUCCESS,data);}public static ResponseData fail(Object data){return new ResponseData(200,ERROR,data);}public static ResponseData fail(ApiError apiError){return new ResponseData(apiError.getErrorCode(),apiError.getErrorMsg(),apiError.getErrorName());}
}

github代碼

GitHub - yezonggang/demo20220905real: 最新整理的spirngboot開發腳手架,開發框架

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/192630.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息