还不会SpringBoot项目模块分层?来这手把手教你
前言缘由
经常看到网上很多优秀的开源项目中,代码简洁,模块分层完美。反观自己代码层级混乱,,却不知如何整理分层。此文手把手教你一步一步创建模块,左手右手一个慢动作。结合本人实际开发及个人项目中分层思路的分享,大神请勿喷。主要目标熟练掌握SpringBoot项目分层思路,丝滑拆分模块熟悉代码层级依赖,规范化管理模块分布手把手实战学习,理论实践相结合试用人群对于Springboot熟悉但是不知道合理分层小白有自己分层思路可以互相分享学习水图
下图反面教材,传统单体应用,结构臃肿
下图分层截选自本人的一个小项目,模块清晰,分工明确
我们要实现的小栗子的分层
正文1。IDEA新建项目
起名第一步,一个好名字,说不定是个好的开始
假如我们的项目是个聊天相关的项目,英文对应chat,所以定义项目名为chatboot,其他的以此效仿
点击Newproject
选择Maven项目,并选择合适JDK版本,点击Next
录入项目名称,并填写GAV坐标,点击Finish
删除无用文件及目录,如src目录和。iml文件
删除后项目目录
修改pom。xml中依赖,增加springbootstarterparentparentgroupIdorg。springframework。bootgroupIdspringbootstarterparentartifactIdversion2。3。1。RELEASEversionparent复制代码
2。创建子模块dependencies(依赖层)
右击项目chatboot,newMoudle新建模块chatbootdependencies
选择对应ModuleSDK版本,本人选择jdk1。8
填写子模块名chatbootdependencies,然后检查对应GAV,点击Finish
生成子模块chatbootdependencies如下图
删除chatbootdependencies下无用文件及目录,如src目录,删除无用目录如下
完善chatbootdependencies下pom。xml依赖,常用依赖放入,作为依赖主体,以下是本狗常用依赖,可酌情选择;记得把packaging改为pomlt;?xmlversion1。0encodingUTF8?projectxmlnshttp:maven。apache。orgPOM4。0。0xmlns:xsihttp:www。w3。org2001XMLSchemainstancexsi:schemaLocationhttp:maven。apache。orgPOM4。0。0http:maven。apache。orgxsdmaven4。0。0。xsdparentchatbootartifactIdgroupIdnet。javadog。chatgroupIdversion1。0SNAPSHOTversionparentmodelVersion4。0。0modelVersionchatdependenciesartifactIdpackagingpompackagingpropertiesmaven。compiler。source8maven。compiler。sourcemaven。compiler。target8maven。compiler。targetproject。build。sourceEncodingUTF8project。build。sourceEncodingproject。reporting。outputEncodingUTF8project。reporting。outputEncodingmysqlconnectorjava。version8。0。17mysqlconnectorjava。versiondruid。version1。1。21druid。versionmybatisplus。version3。4。1mybatisplus。versionfastjson。version1。2。75fastjson。versionhutool。version5。5。8hutool。versionlombok。versin1。18。12lombok。versineasypoi。version4。2。0easypoi。versionspringfoxswagger2。version2。9。2springfoxswagger2。versionspringfoxswaggerui。version2。9。2springfoxswaggerui。versionknife4j。version2。0。4knife4j。versionweixin。version4。4。5。Bweixin。versionshiro。version1。3。2shiro。versionjwt。version3。2。0jwt。versionpropertiesdependencyManagementdependencies!mybatisplusdependencygroupIdcom。baomidougroupIdmybatisplusbootstarterartifactIdversion{mybatisplus。version}versiondependency!数据库驱动,可根据自己需要自行删减,默认使用mysqldependencygroupIdmysqlgroupIdmysqlconnectorjavaartifactIdversion{mysqlconnectorjava。version}versiondependency!数据库连接池dependencygroupIdcom。alibabagroupIddruidartifactIdversion{druid。version}versiondependency!fastjsondependencygroupIdcom。alibabagroupIdfastjsonartifactIdversion{fastjson。version}versiondependency!hutooldependencygroupIdcn。hutoolgroupIdhutoolallartifactIdversion{hutool。version}versiondependency!lombokdependencygroupIdorg。projectlombokgroupIdlombokartifactIdversion{lombok。versin}versiondependency!swagger2dependencygroupIdio。springfoxgroupIdspringfoxswagger2artifactIdversion{springfoxswagger2。version}versiondependency!swaggeruidependencygroupIdio。springfoxgroupIdspringfoxswaggeruiartifactIdversion{springfoxswaggerui。version}versiondependency!swagger接口文档dependencygroupIdcom。github。xiaoymingroupIdknife4jspringbootstarterartifactIdversion{knife4j。version}versiondependency!easypoi导入导出dependencygroupIdcn。afterturngroupIdeasypoibaseartifactIdversion{easypoi。version}versiondependency!WxJava微信开发JavaSDKdependencygroupIdcom。github。binarywanggroupIdweixinjavaminiappartifactIdversion{weixin。version}versiondependency!整合Shiro安全框架dependencygroupIdorg。apache。shirogroupIdshirospringartifactIdversion{shiro。version}versiondependency!集成jwt实现token认证dependencygroupIdcom。auth0groupIdjavajwtartifactIdversion{jwt。version}versiondependencydependenciesdependencyManagementproject复制代码重点
此处用的标签是dependencyManagement,
dependencyManagement只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。3。创建子模块main(主启动层)
右击项目chatboot,newMoudle新建模块chatbootmain
选择对应ModuleSDK版本,本狗选择jdk1。8,点击Next
填写子模块名chatbootmain,然后检查对应GAV,点击Finish
生成子模块chatbootmain如下图
完善chatbootmain模块下pom。xml中依赖引入必要依赖完善profiles标签中环境相关配置build标签中插件lt;?xmlversion1。0encodingUTF8?projectxmlnshttp:maven。apache。orgPOM4。0。0xmlns:xsihttp:www。w3。org2001XMLSchemainstancexsi:schemaLocationhttp:maven。apache。orgPOM4。0。0http:maven。apache。orgxsdmaven4。0。0。xsdparentchatbootartifactIdgroupIdnet。javadog。chatgroupIdversion1。0SNAPSHOTversionparentmodelVersion4。0。0modelVersionchatbootmainartifactIdpropertiesmaven。compiler。source8maven。compiler。sourcemaven。compiler。target8maven。compiler。targetpropertiesdependencyManagementdependenciesdependencygroupIdnet。javadog。chatgroupIdchatbootdependenciesartifactIdversion1。0SNAPSHOTversiontypepomtypescopeimportscopedependencydependenciesdependencyManagementdependencies!webdependencygroupIdorg。springframework。bootgroupIdspringbootstarterwebartifactIddependency!lombokdependencygroupIdorg。projectlombokgroupIdlombokartifactIddependency!swagger2dependencygroupIdio。springfoxgroupIdspringfoxswagger2artifactIddependency!swaggeruidependencygroupIdio。springfoxgroupIdspringfoxswaggeruiartifactIddependency!swagger接口文档dependencygroupIdcom。github。xiaoymingroupIdknife4jspringbootstarterartifactIddependencydependenciesbuildfinalNamechatfinalNamepluginsplugingroupIdorg。springframework。bootgroupIdspringbootmavenpluginartifactIdexecutionsexecutiongoalsgoalrepackagegoalgoalsexecutionexecutionsconfigurationforktrueforkconfigurationpluginpluginsresourcesresourcedirectorysrcmainwebappdirectoryfilteringfalsefilteringresourceresourcedirectorysrcmainresourcesdirectoryfilteringtruefilteringresourceresourcedirectorysrcmainjavadirectoryincludesinclude。xmlincludeincludesresourceresourcesbuildprofilesprofileidlocalidpropertiesspring。activelocalspring。activepropertiestrueactiveByDefaultactivationprofileprofileiddevidpropertiesspring。activedevspring。activepropertiesprofileprofileidprodidpropertiesspring。activeprodspring。activepropertiesprofileprofilesproject复制代码重点配置引入依赖chatbootdependencies,用作此模块依赖引入dependencyManagementdependenciesdependencygroupIdnet。javadog。chatgroupIdchatbootdependenciesartifactIdversion1。0SNAPSHOTversiontypepomtypescopeimportscopedependencydependenciesdependencyManagement复制代码配置build标签用于完善插件plugins,其中包含mavencompilerplugin和mavenresourcespluginbuildpluginsplugingroupIdorg。apache。maven。pluginsgroupIdmavencompilerpluginartifactIdversion3。1versionconfigurationsource{java。version}sourcetarget{java。version}targetconfigurationpluginplugingroupIdorg。apache。maven。pluginsgroupIdmavenresourcespluginartifactIdversion2。6versionconfigurationdelimitersdelimiterdelimiterdelimitersuseDefaultDelimitersfalseuseDefaultDelimitersconfigurationpluginpluginsresourcesresourcedirectorysrcmainwebappdirectoryfilteringfalsefilteringresourceresourcedirectorysrcmainresourcesdirectoryfilteringtruefilteringresourceresourcedirectorysrcmainjavadirectoryincludesinclude。xmlincludeincludesresourceresourcesbuild复制代码配置profiles环境变量标签,用于方便打包切换,本狗设置了local、dev、prod三种环境profilesprofileidlocalidpropertiesspring。activelocalspring。activepropertiestrueactiveByDefaultactivationprofileprofileiddevidpropertiesspring。activedevspring。activepropertiesprofileprofileidprodidpropertiesspring。activeprodspring。activepropertiesprofileprofiles复制代码
操作可在IDEA右上角方便切换环境
切记一定主动Reload一下Maven依赖切记一定主动Reload一下Maven依赖切记一定主动Reload一下Maven依赖
在chatbootmain模块中加入启动类,在srcmainjava下右键NewJavaClass
录入启动类名ChatApplication
完善ChatApplication启动类代码packagenet。javadog。chat;importcom。github。xiaoymin。knife4j。spring。annotations。EnableKnife4j;importlombok。extern。slf4j。Slf4j;importorg。springframework。boot。SpringApplication;importorg。springframework。boot。autoconfigure。SpringBootApplication;importorg。springframework。boot。web。servlet。ServletComponentScan;importorg。springframework。context。ConfigurableApplicationContext;importorg。springframework。core。env。Environment;importspringfox。documentation。swagger2。annotations。EnableSwagger2;importjava。net。InetAddress;importjava。net。UnknownHostException;author:hdxDate:2023012811:24version:1。0SpringBootApplicationServletComponentScanSlf4jEnableSwagger2EnableKnife4jpublicclassChatApplication{publicstaticvoidmain(String〔〕args)throwsUnknownHostException{启动类ConfigurableApplicationContextapplicationSpringApplication。run(ChatApplication。class,args);打印基础信息info(application);}staticvoidinfo(ConfigurableApplicationContextapplication)throwsUnknownHostException{Environmentenvapplication。getEnvironment();StringipInetAddress。getLocalHost()。getHostAddress();Stringportenv。getProperty(server。port);Stringactiveenv。getProperty(spring。profiles。active);StringcontextPathenv。getProperty(server。servlet。contextpath);if(contextPathnull){contextPath;}log。info(欢迎访问https:blog。javadog。net示例程序【active】环境已启动!地址如下:Local:http:localhost:portcontextPathExternal:http:ip:portcontextPathSwagger文档:http:ip:portcontextPathdoc。html);}}复制代码
配置application。yml文件
application。ymlserver配置server:port:82maxhttpheadersize:10240servlet:contextpath:chatv1spring配置spring:application:应用名name:chatprofiles:active:spring。activeservlet:multipart:maxrequestsize:100MBmaxfilesize:100MBjackson:timezone:GMT8dateformat:yyyyMMddHH:mm:ss。SSSlocale:zhCNserialization:格式化输出indentoutput:falsemain:allowcircularreferences:true解决swagger版本路径不兼容问题mvc:pathmatch:matchingstrategy:antpathmatchermybatisplus配置mybatisplus:mapperlocations:classpath:mapper。xmlconfiguration:mapunderscoretocamelcase:truecacheenabled:truelazyloadingenabled:truemultipleresultsetsenabled:truelogimpl:org。apache。ibatis。logging。nologging。NoLoggingImplglobalconfig:banner:falsedbconfig:idtype:assignidtableunderline:trueenablesqlrunner:true数据库类型dbtype:MYSQLconfigurationproperties:prefix:如果数据库为postgresql,则需要配置为blobType:BINARYblobType:BLOB如果数据库为oracle或mssql,则需要配置为boolValue:1boolValue:truelogging配置logging:level:root:infofile:path:rootjavadogchatlogs{spring。application。name}name:{spring。application。name}logback:rollingpolicy:maxhistory:7maxfilesize:10MBfile配置file:静态附件前缀staticprefix:attach上传的文件对外暴露的访问路径accesspathpattern:{file。staticprefix}文件上传目录uploadfolder:rootjavadogchat文件上传最大maxpostsize:10复制代码
applicationlocal。yml服务配置server:port:8001maxhttpheadersize:10240Mysql数据库spring:datasource:driverclassname:com。mysql。cj。jdbc。Driverurl:jdbc:mysql:localhost:3306chatboot?autoReconnecttrueuseUnicodetruecharacterEncodingutf8zeroDateTimeBehaviorCONVERTTONULLuseSSLfalseserverTimezoneCTTnullCatalogMeansCurrenttrueusername:rootpassword:rootredis:host:localhostport:6379password:复制代码
applicationdev。yml服务配置server:port:7001maxhttpheadersize:10240mybatisplus配置mybatisplus:configuration:logimpl:org。apache。ibatis。logging。stdout。StdOutImpl复制代码
applicationprod。yml服务配置server:port:8005复制代码
顺便加一下logbackspring。xml日志文件lt;?xmlversion1。0encodingUTF8?configurationscantruescanPeriod60secondsdebugfalseconversionRuleconversionWordclrconverterClassorg。springframework。boot。logging。logback。ColorConverterconversionRuleconversionWordwexconverterClassorg。springframework。boot。logging。logback。WhitespaceThrowableProxyConverterconversionRuleconversionWordwExconverterClassorg。springframework。boot。logging。logback。ExtendedWhitespaceThrowableProxyConverterpropertynameCONSOLELOGPATTERNvalue{CONSOLELOGPATTERN:clr(d{yyyyMMddHH:mm:ss。SSS}){faint}clr({LOGLEVELPATTERN:5p})clr({PID:}){magenta}clr(){faint}clr(〔15。15t〕){faint}clr(40。40logger{39}){cyan}clr(:){faint}mn{LOGEXCEPTIONCONVERSIONWORD:wEx}}propertynameFILELOGPATTERNvalue{FILELOGPATTERN:d{yyyyMMddHH:mm:ss。SSS}{LOGLEVELPATTERN:5p}{PID:}〔t〕40。40logger{39}:mn{LOGEXCEPTIONCONVERSIONWORD:wEx}}springPropertyscopecontextnameapplication。namesourcespring。application。namedefaultValuejavadogspringPropertyscopecontextnamelogging。pathsourcelogging。file。pathdefaultValuelogsspringPropertyscopecontextnamelogging。file。maxsizesourcelogging。logback。rollingpolicy。maxsizedefaultValue10MBspringPropertyscopecontextnamelogging。file。maxhistorysourcelogging。logback。rollingpolicy。maxhistorydefaultValue30contextName{application。name}contextNamespringProfilenamedev,prod!输出到控制台encoderpattern{CONSOLELOGPATTERN}patternencoderappenderrootlevelinforootspringProfilespringProfilenamedev,test,prod!输出到文件file{logging。path}info{application。name}info。logfilerollingPolicyclassch。qos。logback。core。rolling。TimeBasedRollingPolicyfileNamePattern{logging。path}info{application。name}info。d{yyyyMMdd}。i。logfileNamePatterntimeBasedFileNamingAndTriggeringPolicyclassch。qos。logback。core。rolling。SizeAndTimeBasedFNATPmaxFileSize{logging。file。maxsize}maxFileSizetimeBasedFileNamingAndTriggeringPolicy!只保留最近n天的日志maxHistory{logging。file。maxhistory}maxHistoryrollingPolicy!追加方式记录日志trueappendencoderpattern{FILELOGPATTERN}patternencoderappenderfilterclassch。qos。logback。classic。filter。LevelFilterlevelwarnlevelonMatchACCEPTonMatchonMismatchDENYonMismatchfilterfile{logging。path}warn{application。name}warn。logfilerollingPolicyclassch。qos。logback。core。rolling。TimeBasedRollingPolicyfileNamePattern{logging。path}warn{application。name}warn。d{yyyyMMdd}。i。logfileNamePatterntimeBasedFileNamingAndTriggeringPolicyclassch。qos。logback。core。rolling。SizeAndTimeBasedFNATPmaxFileSize{logging。file。maxsize}maxFileSizetimeBasedFileNamingAndTriggeringPolicy!只保留最近n天的日志maxHistory{logging。file。maxhistory}maxHistoryrollingPolicyencoderpattern{FILELOGPATTERN}patternencoderappenderfilterclassch。qos。logback。classic。filter。LevelFilterlevelerrorlevelonMatchACCEPTonMatchonMismatchDENYonMismatchfilterfile{logging。path}error{application。name}error。logfilerollingPolicyclassch。qos。logback。core。rolling。TimeBasedRollingPolicyfileNamePattern{logging。path}error{application。name}error。d{yyyyMMdd}。i。logfileNamePatterntimeBasedFileNamingAndTriggeringPolicyclassch。qos。logback。core。rolling。SizeAndTimeBasedFNATPmaxFileSize{logging。file。maxsize}maxFileSizetimeBasedFileNamingAndTriggeringPolicy!只保留最近n天的日志maxHistory{logging。file。maxhistory}maxHistoryrollingPolicyencoderpattern{FILELOGPATTERN}patternencoderappenderrootlevelINFOrootspringProfileconfiguration复制代码
启动一下项目试试,启动如下证明成功。如果报错少依赖请再拉一下Maven依赖!!!
4。创建子模块module(模块层)
右击项目chatboot,newMoudle新建模块chatbootmodule
填写子模块名chatbootmodule,然后检查对应GAV,点击Finish
生成子模块chatbootmodule如下图
删除chatbootmodule下无用文件及目录,如src目录,删除无用目录如下
自此外部大框架初步搭建成功
完善chatbootmodule下pom。xml依赖,如lombok,web等必要依赖lt;?xmlversion1。0encodingUTF8?projectxmlnshttp:maven。apache。orgPOM4。0。0xmlns:xsihttp:www。w3。org2001XMLSchemainstancexsi:schemaLocationhttp:maven。apache。orgPOM4。0。0http:maven。apache。orgxsdmaven4。0。0。xsdparentchatbootartifactIdgroupIdnet。javadog。chatgroupIdversion1。0SNAPSHOTversionparentmodelVersion4。0。0modelVersionchatbootmoduleartifactIdpackagingpompackagingmodulesmodulechatbootcommonmodulemodulechatbootcontrollermodulemodulechatbootdaomodulemodulechatbootdtomodulemodulechatbootentitymodulemodulechatbootservicemodulemodulespropertiesmaven。compiler。source8maven。compiler。sourcemaven。compiler。target8maven。compiler。targetpropertiesdependencyManagementdependenciesdependencygroupIdnet。javadog。chatgroupIdchatbootdependenciesartifactIdversion{project。parent。version}versiontypepomtypescopeimportscopedependencydependenciesdependencyManagementdependencies!webdependencygroupIdorg。springframework。bootgroupIdspringbootstarterwebartifactIddependency!WxJava微信开发JavaSDKdependencygroupIdcom。github。binarywanggroupIdweixinjavaminiappartifactIddependency!lombokdependencygroupIdorg。projectlombokgroupIdlombokartifactIddependency!hutooldependencygroupIdcn。hutoolgroupIdhutoolallartifactIddependency!swagger2dependencygroupIdio。springfoxgroupIdspringfoxswagger2artifactIddependency!swaggeruidependencygroupIdio。springfoxgroupIdspringfoxswaggeruiartifactIddependency!整合Knife4jdependencygroupIdcom。github。xiaoymingroupIdknife4jspringbootstarterartifactIddependency!整合Shiro安全框架dependencygroupIdorg。apache。shirogroupIdshirospringartifactIddependency!jwtdependencygroupIdcom。auth0groupIdjavajwtartifactIddependency!mybatisplusdependencygroupIdcom。baomidougroupIdmybatisplusbootstarterartifactIddependencydependencygroupIdmysqlgroupIdmysqlconnectorjavaartifactIddependencydependenciesproject复制代码
一定要重新拉取依赖!一定要重新拉取依赖!一定要重新拉取依赖!
5。创建chatbootmodule模块下对应功能分层
目前本狗分为如下6层common共通层controller控制器层dao数据持久层dto数据传输对象层entity实体层service业务逻辑层
依次按照上述添加模块方式进行新增子模块,本狗如下示例一个,其余都如法炮制
右击项目chatbootmodule,newMoudle新建模块chatbootcommon
一定看清楚父模块是否正确一定看清楚父模块是否正确一定看清楚父模块是否正确
确认父级模块后,点击Finish,生成chatbootcommon模块
依次按照上述方法,新建其他模块
chatbootcontroller模块
chatbootdao模块
chatbootdto模块
chatbootentity模块
chatbootservice模块
总体模块雏形基本完成
6。实际流程填充模拟正常前端请求到后台服务调用过程,进行实际代码补充
在chatbootentity下新建实体类User,在srcmainjava下右键NewJavaClass,录入包名及类名
packagenet。javadog。chat。entity;importlombok。Data;author:hdxDate:2023012814:26version:1。0DatapublicclassUser{privateLongid;privateStringusername;privateStringidCard;}复制代码
在chatbootdto下新建目request和response,分别代表请求传输对象和返回传输对象,并分别在目录下创建UserRequest。java和UserResponse。java
packagenet。javadog。chat。request;importlombok。Data;author:hdxDate:2023012814:59version:1。0DatapublicclassUserRequest{privateLongid;privateStringusername;}复制代码packagenet。javadog。chat。response;importlombok。Data;author:hdxDate:2023012814:59version:1。0DatapublicclassUserResponse{privateLongid;privateStringusername;}复制代码
在chatbootdao下修改chatbootdao模块下修改pom。xml文件依赖,引入chatbootentity;并增对应UserMapper。javapackagenet。javadog。chat。mapper;importcom。baomidou。mybatisplus。core。mapper。BaseMapper;importnet。javadog。chat。entity。User;用户mapperauthor:hdxDate:2023011011:43version:1。0publicinterfaceUserMapperextendsBaseMapperUser{}复制代码lt;?xmlversion1。0encodingUTF8?projectxmlnshttp:maven。apache。orgPOM4。0。0xmlns:xsihttp:www。w3。org2001XMLSchemainstancexsi:schemaLocationhttp:maven。apache。orgPOM4。0。0http:maven。apache。orgxsdmaven4。0。0。xsdparentchatbootmoduleartifactIdgroupIdnet。javadog。chatgroupIdversion1。0SNAPSHOTversionparentmodelVersion4。0。0modelVersionchatbootdaoartifactIdpropertiesmaven。compiler。source8maven。compiler。sourcemaven。compiler。target8maven。compiler。targetpropertiesdependenciesdependencygroupIdnet。javadog。chatgroupIdchatbootentityartifactIdversion{project。parent。version}versiondependencydependenciesproject复制代码
在chatbootservice下新建目录service和impl,并在对应目录下新建UserService。java和UserServiceImpl。java,并修改chatbootservice模块下修改pom。xml文件依赖,引入chatbootdto,chatbootdao
packagenet。javadog。chat。service;importcom。baomidou。mybatisplus。extension。service。IService;importnet。javadog。chat。entity。User;用户接口author:hdxDate:2023011011:53version:1。0publicinterfaceUserServiceextendsIServiceUser{}复制代码packagenet。javadog。chat。service。impl;importcom。baomidou。mybatisplus。extension。service。impl。ServiceImpl;importnet。javadog。chat。entity。User;importnet。javadog。chat。mapper。UserMapper;importnet。javadog。chat。service。UserService;importorg。springframework。stereotype。Service;用户接口实现类author:hdxDate:2023011011:55version:1。0ServicepublicclassUserServiceImplextendsServiceImplUserMapper,UserimplementsUserService{}复制代码lt;?xmlversion1。0encodingUTF8?projectxmlnshttp:maven。apache。orgPOM4。0。0xmlns:xsihttp:www。w3。org2001XMLSchemainstancexsi:schemaLocationhttp:maven。apache。orgPOM4。0。0http:maven。apache。orgxsdmaven4。0。0。xsdparentchatbootmoduleartifactIdgroupIdnet。javadog。chatgroupIdversion1。0SNAPSHOTversionparentmodelVersion4。0。0modelVersionchatbootserviceartifactIdpropertiesmaven。compiler。source8maven。compiler。sourcemaven。compiler。target8maven。compiler。targetpropertiesdependenciesdependencygroupIdnet。javadog。chatgroupIdchatbootdaoartifactIdversion{project。parent。version}versiondependencydependencygroupIdnet。javadog。chatgroupIdchatbootdtoartifactIdversion{project。parent。version}versiondependencydependenciesproject复制代码
在chatbootcontroller创建UserController。java,并修改chatbootcontroller模块下修改pom。xml文件依赖,引入chatbootdto,chatbootservice
packagenet。javadog。chat。controller;importcn。hutool。core。bean。BeanUtil;importio。swagger。annotations。Api;importio。swagger。annotations。ApiOperation;importnet。javadog。chat。entity。User;importnet。javadog。chat。request。UserRequest;importnet。javadog。chat。response。UserResponse;importnet。javadog。chat。service。UserService;importorg。springframework。web。bind。annotation。;importjavax。annotation。Resource;用户控制器author:hdxDate:2022120715:48version:1。0Api(tags用户控制器)RestControllerRequestMapping(user)publicclassUserController{ResourceprivateUserServiceuserService;ApiOperation(value用户详情,notes用户详情)GetMappingpublicUserResponsedetail(UserRequestuserRequest){UserResponseuserResponsenewUserResponse();UseruseruserService。getById(userRequest。getId());BeanUtil。copyProperties(user,userResponse);returnuserResponse;}}复制代码
重要补充1。切记修改chatbootmain下的pom。xml依赖,将chatbootcontroller模块加入2。切记修改chatbootmain下的pom。xml依赖,将chatbootdao模块加入3。切记修改启动类ChatApplication中加入MapperScan注解
lt;?xmlversion1。0encodingUTF8?projectxmlnshttp:maven。apache。orgPOM4。0。0xmlns:xsihttp:www。w3。org2001XMLSchemainstancexsi:schemaLocationhttp:maven。apache。orgPOM4。0。0http:maven。apache。orgxsdmaven4。0。0。xsdparentchatbootartifactIdgroupIdnet。javadog。chatgroupIdversion1。0SNAPSHOTversionparentmodelVersion4。0。0modelVersionchatbootmainartifactIdpropertiesmaven。compiler。source8maven。compiler。sourcemaven。compiler。target8maven。compiler。targetpropertiesdependencyManagementdependenciesdependencygroupIdnet。javadog。chatgroupIdchatbootdependenciesartifactIdversion1。0SNAPSHOTversiontypepomtypescopeimportscopedependencydependenciesdependencyManagementdependencies!webdependencygroupIdorg。springframework。bootgroupIdspringbootstarterwebartifactIddependency!lombokdependencygroupIdorg。projectlombokgroupIdlombokartifactIddependency!swagger2dependencygroupIdio。springfoxgroupIdspringfoxswagger2artifactIddependency!swaggeruidependencygroupIdio。springfoxgroupIdspringfoxswaggeruiartifactIddependency!swagger接口文档dependencygroupIdcom。github。xiaoymingroupIdknife4jspringbootstarterartifactIddependency!controllerdependencygroupIdnet。javadog。chatgroupIdchatbootcontrollerartifactIdversion{project。parent。version}versiondependency!daodependencygroupIdnet。javadog。chatgroupIdchatbootdaoartifactIdversion{project。parent。version}versiondependencydependenciesbuildpluginsplugingroupIdorg。apache。maven。pluginsgroupIdmavencompilerpluginartifactIdversion3。1versionconfigurationsource{java。version}sourcetarget{java。version}targetconfigurationpluginplugingroupIdorg。apache。maven。pluginsgroupIdmavenresourcespluginartifactIdversion2。6versionconfigurationdelimitersdelimiterdelimiterdelimitersuseDefaultDelimitersfalseuseDefaultDelimitersconfigurationpluginpluginsresourcesresourcedirectorysrcmainwebappdirectoryfilteringfalsefilteringresourceresourcedirectorysrcmainresourcesdirectoryfilteringtruefilteringresourceresourcedirectorysrcmainjavadirectoryincludesinclude。xmlincludeincludesresourceresourcesbuildprofilesprofileidlocalidpropertiesspring。activelocalspring。activepropertiestrueactiveByDefaultactivationprofileprofileiddevidpropertiesspring。activedevspring。activepropertiesprofileprofileidprodidpropertiesspring。activeprodspring。activepropertiesprofileprofilesproject复制代码
packagenet。javadog。chat;importcom。github。xiaoymin。knife4j。spring。annotations。EnableKnife4j;importlombok。extern。slf4j。Slf4j;importorg。mybatis。spring。annotation。MapperScan;importorg。springframework。boot。SpringApplication;importorg。springframework。boot。autoconfigure。SpringBootApplication;importorg。springframework。boot。web。servlet。ServletComponentScan;importorg。springframework。context。ConfigurableApplicationContext;importorg。springframework。core。env。Environment;importspringfox。documentation。swagger2。annotations。EnableSwagger2;importjava。net。InetAddress;importjava。net。UnknownHostException;author:hdxDate:2023012811:24version:1。0SpringBootApplicationServletComponentScanSlf4jEnableSwagger2EnableKnife4jMapperScan(basePackages{net。javadog。chat。mapper})publicclassChatApplication{publicstaticvoidmain(String〔〕args)throwsUnknownHostException{启动类ConfigurableApplicationContextapplicationSpringApplication。run(ChatApplication。class,args);打印基础信息info(application);}staticvoidinfo(ConfigurableApplicationContextapplication)throwsUnknownHostException{Environmentenvapplication。getEnvironment();StringipInetAddress。getLocalHost()。getHostAddress();Stringportenv。getProperty(server。port);Stringactiveenv。getProperty(spring。profiles。active);StringcontextPathenv。getProperty(server。servlet。contextpath);if(contextPathnull){contextPath;}log。info(欢迎访问https:blog。javadog。net示例程序【active】环境已启动!地址如下:Local:http:localhost:portcontextPathExternal:http:ip:portcontextPathSwagger文档:http:ip:portcontextPathdoc。html);}}复制代码7。示例DB更新模拟正常前端请求到后台服务调用过程,进行实际代码补充
DROPTABLEIFEXISTSuser;CREATETABLEuser(idbigint(20)NOTNULLCOMMENTid,usernamevarchar(255)CHARACTERSETutf8COLLATEutf8generalciNULLDEFAULTNULLCOMMENT用户名,idcardvarchar(255)CHARACTERSETutf8COLLATEutf8generalciNULLDEFAULTNULLCOMMENT身份证,PRIMARYKEY(id)USINGBTREE)ENGINEInnoDBCHARACTERSETutf8COLLATEutf8generalciROWFORMATDynamic;RecordsofuserINSERTINTOuserVALUES(1,JavaDog,123123);复制代码8。访问测试
浏览器访问http:localhost:8001chatv1user?id1
测试成功如下图所示
总结
以上示例只是简单示范分层思路,其中代码逻辑实现方式有很多种,大家选取适用自己就好,希望自己的思路能对大家有帮助
如遇缺少依赖情况,一定要重新拉取依赖!