专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

还不会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
  测试成功如下图所示
  总结
  以上示例只是简单示范分层思路,其中代码逻辑实现方式有很多种,大家选取适用自己就好,希望自己的思路能对大家有帮助
  如遇缺少依赖情况,一定要重新拉取依赖!

辛吉飞宣布退网我累了不拍了,希望你们商家都能有一点怜悯之心就在最近,辛吉飞突然宣布退网,表示自己累了不拍了。根据他之前发的一个视频,我们可以看出辛吉飞差点遭遇车祸。而且据说对方是故意逆行撞他,搞得他差点就撞上了护栏上。很多人就觉得,他这是住别墅涂发胶嫌弃白面烧饼等,抗日剧为了钱真的无所不为了吗?大家还记得史中鹏吗?早在10年前,他就已经是名副其实的网红了。这个靠在横店当群演谋生的青年,做梦也想不到,有一天竟然会被媒体争相报道,并上了多档节目。他走红的原因也很简单,是因为在李嘉欣和儿子共浴,多次接吻惹争议父母没有边界感,有多可怕?香港的港姐李嘉欣,想必大家都很熟悉。那艳丽无比的脸庞曾经艳绝香江,多少香港富豪都曾为她痴狂,而她更是被影迷们称为香港最美港姐。自从嫁入豪门后,李嘉欣就逐渐退出娱乐圈,较少出现在公众一个曾经被包养,一个爱玩不顾家,袁咏仪张智霖也好意思秀恩爱?一1985年,靠卖风扇起家的刘銮雄一头闯入股市,凭借胆大心细运气好的特质抄底多家股票,然后倒手卖出,轻松赚了几个亿。随后,刘銮雄又将战场扩展到了房地产建筑材料影视传媒等行业,商业帝张柏芝罕见提到谢霆锋,离婚11年终于释怀,对他的称呼非常得体10月10日,据台媒报道,张柏芝在新参加的节目中,罕见提到前夫谢霆锋,大方得体的称呼非常得体,看得出来张柏芝对于谢霆锋已经释怀了,双方之间也只剩两个儿子需要维持联系。据悉,张柏芝在张柏芝罕晒三个儿子近照,4岁小儿子暴风成长,三娃都是高个子男孩10月8日,张柏芝在社交账号上分享了儿子们的近照,这次,张柏芝还罕见地晒出自己与三儿子Marcus的合照。照片中,张柏芝身穿一件灰色卫衣,一副大框墨镜遮住大边脸,一双美腿格外抢镜。曾经的央视一姐,如今的豪门阔太,董卿也被娱圈同化了?胸藏文墨虚若谷,腹有诗书气自华!央视一姐董卿,给我们的形象总是端庄大气知性优雅满腹经纶侃侃而谈。的确,在董卿13年的春晚主持中,她用出色表现赢得了中国亿万观众的赞赏与肯定在朗读者中7周年投票返场延期,3款新皮肤曝光,限时点券取消,瑶妹玩家狂喜曼姐出品,必属优品。大家好,我是人见人爱的小曼姐。说到王者荣耀的周年庆,已经是越来越近了,其实也就是剩下十多天而已。当然了,王者荣耀对此七周年庆典依旧是很重视的,从头像框的设计,再跑跑卡丁车手游传说道具车狂野鲨狂野鲨是2022年10月5日S20赛季通过幸运翻翻乐获得的一辆传说道具车。是一辆辅助上位车。使用磁铁和黄金磁铁时高概率获得的胎印导弹可以保证狂野鲨有稳定的输出和上位能力,胎印导弹命Jackeylove德莱文败北,TES不敌DRX,官博用两句话回应粉丝2022电竞季时至10月10日,在GENT1EDGRNG等队伍赢下比赛后,由LPL二号种子TESLCK四号种子DRX带来的S12全球总决赛小组赛压轴战准时打响,距离单日全胜,LPL说实话,芯片厂商们更希望停留在7nm,不要3nm5nm这些目前,三星已经实现了3nm芯片的量产,台积电实现了3nm的试产。而2025年,三星台积电均要实现2nm芯片的量产,intel表示要实现2nm1。8nm芯片的量产。而2027年,三星
混合估值法刷屏!不亏本的银行理财重出江湖?真相是视频加载中为了挽留客户,银行理财子公司究竟能有多拼?据报道,近期包括工银理财招银理财平安理财在内的多家机构相继推出了混合估值法产品。有人感叹这是不亏本的银行理财要回来的节奏呀。。混医健年报扫描核酸检测退场减缓部分企业增速,IVD行业加码常规业务21世纪经济报道记者唐唯珂实习生杨斯琪广州报道近期,国内IVD上市企业陆续公布2022年度业绩预告,整体上看,体外诊断行业依然表现依然强势。凭借在美国销售试剂盒等新冠防疫产品,九安银行里卖的储蓄型保险,虽然十分可靠,但缺点也很明显一直以来,银行在大家心中的形象都是比较靠谱的。如果是银行工作人员推荐的产品,大多数人都愿意了解一下。就拿银行推荐的储蓄型保险来说,就让很多人特别心动。不过,对于刚刚开始接触储蓄型保解析关陇集团,是怎么让隋亡唐兴的关陇集团呢是西魏宇文泰创立的一个集团。这个集团的特点是,他们的主要成员都是由一些军功贵族组成的这个军功贵族,而且都是关陇地区的世家大族。他们绝大多数出将入相,而且内部相互通婚联姻,经济日报携手京东发布数据她力量助力绿色经济数据来源京东消费及产业发展研究院女性消费推动可持续发展越来越多的数据表明,女性是践行可持续消费的重要力量。特别是在消费领域,绿色减碳已成为女性消费的重要准则,并使女性成为可持续消费初春,阿坝州夜生活的N种打开方式随着天气转暖,初春来临阿坝州的夜生活也焕发了新的生机火热的夜生活渐渐回到了大家的视野夜幕降临,华灯初上被忽视的美好正一步一步走来今天,小编就带你一起去玩去看get阿坝州夜生活的N种芙蓉国评论网聚正能量争做湖湘好网民2022年度湖湘好网民名单揭晓,40名网友被评为文明大使。陈觉2月8日,由湖南省委网信办指导,湖南红网新媒体集团承办的2022年度湖湘好网民新风大典评选颁奖仪式在红网演播中心举行,立春了才发现半身长裙才是优雅女人正确打开方式,美得犯规女人真正的优雅,从来都不是通过颜值和身材体现出来的,而是需要保持优美的身姿体态,并且精心的打扮之后,才可以让你看上去更迷人。直到立春了之后才发现,真正优雅的女人都爱穿半身长裙,就像时髦精秋冬季最爱的搭配方式毛衣背心WINTERSTYLE秋冬背心花式风格毛衣背心向来是个可塑性很强的单品,一般都是与其他单品进行叠穿,冬季穿衣最怕的就是臃肿,毛衣背心采用无袖设计,从袖口露出内搭的长袖,显瘦富有层次一周未来商业丨黄光裕不再是国美零售控股股东东方甄选首次投资供应链企业椰子生活方式品牌可可满分完成A轮融资每经记者陈婷王郁彪王紫薇杨昕怡赵雯琪每经编辑刘雪梅每经未来商业智库每周定期分享一周未来商业,围绕电商新消费物流供应链生活服务以及未来商业创新创投领域,以事件短评的形式,洞见未来商业用户开小号套取蚂蚁森林绿色能量被封号,法院判决处罚正当IT之家2月7日消息,据杭州互联网法院消息,近期,该院判决了两起涉及套取蚂蚁森林绿色能量的案件。案例一购买绿色能量开小号浇水哪些种树行为构成违约?在蚂蚁森林中,用户可以通过互相浇水
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网