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

框架搭建单体应用服务之SSM整合Spring4SpringM

  作者:小傅哥
  博客:https:bugstack。cn
  沉淀、分享、成长,让自己和他人都能有所收获!前言介绍
  在实际的业务开发中按照不同的场景需要,会有不同的业务架构也就同时会有不同的技术框架来支撑。那么这个专题想把一些常用的框架整理下,方便平时使用的同时也做一些技术沉淀。那么本章节会先搭建一个比较适合个人项目或者一些小公司开发项目的单体架构模型。服务功能展示页面如下;
  工程环境JDK1。8Maven3。2。3Spring4。3。24。RELEASESpringMvcMybatis3。3。0Mysql5。6dbcp2layui2。5。4工程模型
  整体的工程模型采用DDD四层架构,相对于MVC模式来讲。嗯!相当于家里三居换四居了!itstackdemoframessmsrcmainjavaorg。itstack。demoapplicationUserService。javadomainmodelaggregatesUserInfoCollect。javareqUserReq。javavoUserInfo。javarepositoryIUserRepository。javaserviceUserServiceImpl。javainfrastructurecommonEasyResult。javaPageRequest。javadaoIUserDao。javapoUser。javarepositoryUserRepository。javainterfacesUserController。javaresourcesmapperpropsspringlogback。xmlmybatisconfig。xmlspringconfig。xmlwebapppageresWEBINFindex。htmlreslayui。htmltestjavaorg。itstack。demo。testApiTest。javaapplication应用层
  应用层是比较薄的一层,不做具体逻辑开发。本工程里只包括服务的定义,具体逻辑有领域层实现。如果需要扩展可以做一些应用服务编排。
  applicationUserService。java定义接口publicinterfaceUserService{UserInfoCollectqueryUserInfoList(UserReqreq);}domain领域层
  领域层是整个工程的核心服务层,这里负责处理具体的核心功能,完成领域服务。domain下可以有多个领域,每个领域里包括;聚合、请求对象、业务对象、仓储、服务。
  domainmodelaggregatesUserInfoCollect。java定义聚合查询结果publicclassUserInfoCollect{privateLongcount;privateListUserInfouserInfoList;publicUserInfoCollect(){}publicUserInfoCollect(Longcount,ListUserInfouserInfoList){this。countcount;this。userInfoListuserInfoList;}publicLonggetCount(){returncount;}publicvoidsetCount(Longcount){this。countcount;}publicListUserInfogetUserInfoList(){returnuserInfoList;}publicvoidsetUserInfoList(ListUserInfouserInfoList){this。userInfoListuserInfoList;}}
  domainrepositoryIUserRepository。java定义仓储服务publicinterfaceIUserRepository{UserInfoCollectqueryUserInfoList(UserReqreq);}
  domainserviceUserServiceImpl。java对业务层功能进行实现Service(userService)publicclassUserServiceImplimplementsUserService{Resource(nameuserRepository)privateIUserRepositoryuserRepository;OverridepublicUserInfoCollectqueryUserInfoList(UserReqreq){returnuserRepository。queryUserInfoList(req);}}infrastructure基础层实现领域层仓储定义数据库操作为非业务属性的功能操作在仓储实现层进行组合装配DAORedisCache等
  infrastructuredaoIUserDao。java数据库操作publicinterfaceIUserDao{ListUserqueryUserInfoList(UserReqreq);LongqueryUserInfoCount(UserReqreq);}
  infrastructurerepositoryUserRepository。java仓储功能实现如果有redis可以进行包装使用Repository(userRepository)publicclassUserRepositoryimplementsIUserRepository{ResourceprivateIUserDaouserDao;OverridepublicUserInfoCollectqueryUserInfoList(UserReqreq){LongcountuserDao。queryUserInfoCount(req);ListUseruserListuserDao。queryUserInfoList(req);ListUserInfouserInfoListnewArrayList();userList。forEach(user{UserInfouserInfonewUserInfo();userInfo。setUserId(user。getId());userInfo。setName(user。getName());userInfo。setAge(user。getAge());userInfo。setAddress(user。getAddress());userInfo。setEntryTime(user。getEntryTime());userInfo。setStatus(user。getStatus());userInfoList。add(userInfo);});returnnewUserInfoCollect(count,userInfoList);}}interfaces接口层包装应用接口对外提供api,目前这一层比较简单只需要进行接口使用即可如果是对外部提供服务接口,那么可以使用DTO方式进行转换,避免污染到业务类
  interfacesUserController。java提供接口服务ControllerRequestMapping(apiuser)publicclassUserController{privateLoggerloggerLoggerFactory。getLogger(UserController。class);ResourceprivateUserServiceuserService;RequestMapping(pathqueryUserInfoList,methodRequestMethod。GET)ResponseBodypublicEasyResultqueryUserInfoList(Stringjson,Stringpage,Stringlimit){try{logger。info(查询用户信息列表开始。json:{},json);UserReqreqJSON。parseObject(json,UserReq。class);if(nullreq)reqnewUserReq();req。setPage(page,limit);UserInfoCollectuserInfoCollectuserService。queryUserInfoList(req);logger。info(查询用户信息列表完成。userInfoCollect:{},JSON。toJSONString(userInfoCollect));returnEasyResult。buildEasyResultSuccess(userInfoCollect。getCount(),userInfoCollect。getUserInfoList());}catch(Exceptione){logger。error(查询用户信息列表失败。json:{},json,e);returnEasyResult。buildEasyResultError(e);}}}resource配置
  这里包括了Spring、SpringMvc、mybatis、以及日志信息的配置;
  mapperUserMapper。xmllt;?xmlversion1。0encodingUTF8?!DOCTYPEmapperPUBLICmybatis。orgDTDMapper3。0ENhttp:mybatis。orgdtdmybatis3mapper。dtdmappernamespaceorg。itstack。demo。infrastructure。dao。IUserDaoselectidqueryUserInfoCountresultTypejava。lang。Longselectcount(id)fromuserwhereiftestname!nullandname{name}ififteststatus!nullandstatus{status}ifwhereselectselectidqueryUserInfoListresultTypeorg。itstack。demo。infrastructure。po。UserSELECTid,name,age,address,entryTime,status,remark,createTime,updateTimeFROMuserwhereiftestname!nullandname{name}ififteststatus!nullandstatus{status}ifwherelimit{pageStart},{pageEnd}selectmapper
  propsjdbc。properties数据库链接信息db。jdbc。driverClassNamecom。mysql。jdbc。Driverdb。jdbc。urljdbc:mysql:127。0。0。1:3306itstack?createDatabaseIfNotExisttruecharacterEncodingutf8useUnicodetruedb。jdbc。usernamerootdb。jdbc。password123456
  springspringconfigdatasource。xmldbcp2数据源配置以及扫描Mapper等lt;?xmlversion1。0encodingUTF8?beansxmlnshttp:www。springframework。orgschemabeansxmlns:xsihttp:www。w3。org2001XMLSchemainstancexsi:schemaLocationhttp:www。springframework。orgschemabeanshttp:www。springframework。orgschemabeansspringbeans。xsd!1。数据库连接池beaniddataSourceclassorg。apache。commons。dbcp2。BasicDataSourcepropertynamedriverClassNamevalue{db。jdbc。driverClassName}propertynameurlvalue{db。jdbc。url}propertynameusernamevalue{db。jdbc。username}propertynamepasswordvalue{db。jdbc。password}propertynamemaxTotalvalue20propertynamemaxIdlevalue3propertynamemaxWaitMillisvalue15000propertynametimeBetweenEvictionRunsMillisvalue60000propertynameminEvictableIdleTimeMillisvalue180000bean!2。配置SqlSessionFactory对象beanidsqlSessionFactoryclassorg。mybatis。spring。SqlSessionFactoryBean!注入数据库连接池propertynamedataSourcerefdataSource!配置MyBaties全局配置文件:mybatisconfig。xmlpropertynameconfigLocationvalueclasspath:mybatisconfig。xml!扫描entity包使用别名propertynametypeAliasesPackagevaluecom。soecode。lyf。entity!扫描sql配置文件:mapper需要的xml文件propertynamemapperLocationsvalueclasspath:mapper。xmlbean!3。配置扫描Dao接口包,动态实现Dao接口,注入到spring容器中beanclassorg。mybatis。spring。mapper。MapperScannerConfigurer!注入sqlSessionFactorypropertynamesqlSessionFactoryBeanNamevaluesqlSessionFactory!给出需要扫描Dao接口包propertynamebasePackagevalueorg。itstack。demo。infrastructure。daobeanbeans
  resourcesmybatisconfig。xmllt;?xmlversion1。0encodingUTF8?!DOCTYPEconfigurationPUBLICmybatis。orgDTDConfig3。0ENhttp:mybatis。orgdtdmybatis3config。dtdconfiguration!配置全局属性settings!使用jdbc的getGeneratedKeys获取数据库自增主键值settingnameuseGeneratedKeysvaluetrue!使用列别名替换列名默认:truesettingnameuseColumnLabelvaluetrue!开启驼峰命名转换:Table{createtime}Entity{createTime}settingnamemapUnderscoreToCamelCasevaluetruesettingsconfiguration
  resourcesspringconfig。xmllt;?xmlversion1。0encodingUTF8?beansxmlnshttp:www。springframework。orgschemabeansxmlns:xsihttp:www。w3。org2001XMLSchemainstancexmlns:contexthttp:www。springframework。orgschemacontextxmlns:aophttp:www。springframework。orgschemaaopxsi:schemaLocationhttp:www。springframework。orgschemabeanshttp:www。springframework。orgschemabeansspringbeans3。0。xsdhttp:www。springframework。orgschemacontexthttp:www。springframework。orgschemacontextspringcontext3。0。xsdhttp:www。springframework。orgschemaaophttp:www。springframework。orgschemaaopspringaop3。0。xsddefaultautowirebyNamecontext:componentscanbasepackageorg。itstack!属性文件读入beanclassorg。springframework。beans。factory。config。PropertyPlaceholderConfigurerpropertynamelocationslistvalueclasspath:props。propertiesvaluelistpropertybeanimportresourceclasspath:springspring。xmlbeansitstack。sqlDROPTABLEuser;CREATETABLEuser(idbigint(11)NOTNULLAUTOINCREMENT,namevarchar(32),ageint(4),addressvarchar(128),entryTimedatetime,remarkvarchar(64),createTimedatetime,updateTimedatetime,statusint(4)DEFAULT0,PRIMARYKEY(id),INDEXidxname(name))ENGINEInnoDBDEFAULTCHARSETutf8;insertintouser(id,name,age,address,entryTime,remark,createTime,updateTime,status)values(1,水水,18,吉林省榆树市黑林镇尹家村5组,2019122200:00:00,无,2019122200:00:00,2019122200:00:00,0);insertintouser(id,name,age,address,entryTime,remark,createTime,updateTime,status)values(2,豆豆,18,辽宁省大连市清河湾司马道407路,2019122200:00:00,无,2019122200:00:00,2019122200:00:00,1);insertintouser(id,name,age,address,entryTime,remark,createTime,updateTime,status)values(3,花花,19,辽宁省大连市清河湾司马道407路,2019122200:00:00,无,2019122200:00:00,2019122200:00:00,0);综上总结此工程模型基于SSM比较适合开发ERP服务,ERP使用layui页面清新,功能完善工程框架采用了DDD架构模式,在此架构模式下可以更容易的开发系统,适应后比MVC更加方便后续将继续拓展架构服务搭建,包括一些Dubbo、Redis、mq等使用,方便自己也方便他人

判了无期徒刑的人,每天在监狱干什么?年老了生活怎么办?无期徒刑的人除了刑期是终身,管理方面和一般犯人一样,也是标准的军事化管理。当然,这类重刑犯的看护相对更加严格。之前,听监狱系统工作的朋友说过,监狱平时一般会安排犯人进行劳动改造,根为什么说以后当兵会越来越难?我是岭南通途,我来回答!为什么说以后当兵会越来越难?我自己是长期接触征兵工作的,对于这个问题还是有一定了解的,最近这几年,确确实实当兵的要求越来越高,同时想去的人也越来越多了!十几为什么有的老板可以一整天都待在他自己的办公室里不出来,到底一整天在办公室对着电脑能做什么?我和邻居家的女儿在工厂上班,她内急时就趁着车间里没人,然后直接在工厂的车间里解手。结果被老板开除,差点连累到我跟她一起被开除。这个工厂是投资商,购买我们村的田地建设起来的。因为工厂银行员工忽悠老百姓,把存款变保单造成损失,银行应不应该赔偿?你好,我自己就是邮政储蓄银行的大堂经理。我可以明确的告诉你,如果银行员工忽悠你,把定期存款变成保单,本金造成损失的,你可以要求他们赔偿的。银行工作人员卖保险是有奖励提成的。尤其是那上海大学国际排名比国内很多大学都高。为啥国内排名只有50多?关于上海大学的评价,很多人说上海大学口碑不好,这是一种误解。上海大学主体由三个大学组成,上海科学技术大学,上海工业大学和老上海大学。老上海大学校区分散在市区各个角落,校区面积狭小甚社保缴费了15年,2019年退休后每月仅领取1000元养老金,社保到底值得交吗?为什么?社保缴费15年,2019年退休后每月仅领取1000元养老金,社保到底值得交吗?我觉得题主的认识可能有点以偏概全,态度偏激,其实从综合的结果来看,从长远的目标来看,社保还是值得交的,有没有人跟我一样买房买错位置了,好后悔?前年阳历五月的时候,我也在新区买了一套房子。当时我也是在老城区和新区纠结了好多天。老城区的优点交通便利,配套设施完善,价格相对新区而言便宜了很多。老城区的缺点环境污染严重,楼盘陈旧有什么是你去了澳门才知道的事情?1澳门很小。2澳门人口密度世界最大。3澳门有二十多个博物馆。4澳门虽然被葡萄牙殖民多年,但居民会葡语的比例缺很低。5澳门是有本地语言的,叫土生葡语,基本绝迹了。6澳门打车超贵,但其70后农民工该如何养老?我就是一位70后的农民,也是农民工,对于自己的养老问题早就考虑了,养老不能指望儿女了。农村俗话说得好靠山山倒,靠人人跑,这句话非常形象地说出了人到了老年之后一种真实的现象,身在农村跟随领导开车十年了,挣的也不算多,我该怎么办?你这种想法就不对,难道说给领导开车就想近水楼台先得月。由此也可以判断你这位领导,还是很廉洁的。估计如果他是个大贪官的话,指甲缝里面漏一点点也够你吃一辈子了。或者是你掌握了他的一些秘90年代农村花高价转城市户口的人,现在后悔了吗?90年代农村,花高价转城市户口的人,现在后悔了吗?我是陌上花开,这个问题我来回答。我的一个舅舅,就是花了20000元把全家四口人的农村户口,都转成了城市户口的。那是90年代初,城市
科莫多巨蜥的毒液到底有多可怕?2009年,一名31岁的渔民安瓦尔,在印尼科莫多岛上采摘水果,结果不小心从水果树上掉了下来,刚好踩到了一只巨型蜥蜴,蜥蜴瞬间就朝他扑了过去,咬住了他的腿,之后又咬住了他的手臂,身体武汉未来的房价会涨到100000元平米吗?这个问题的答案是肯定的!以目前的趋势,未来武汉房价必然达到10万的水平,只是时间长短的问题。2010年至2017年,短短七年间,武汉的房价已经翻了3番,目前,武汉部分高端楼盘如洞庭兰州青白石片区,中央公园怎么样?兰州北拓的黄金区域,目前基础交通还跟不上建设需要,交通滞后可能会成为十四五期间兰州青白石片区发展的的最大障碍!不过就兰州地理位置和城区格局而言,青白石片区是离主城区最近的待开发区域农民为什么不在国家统计失业范围之内?中国有四个儿子,大儿子叫工人,二儿子叫子弟兵,三儿子叫公务员,四儿子叫农民,所以四儿子就没有纳入统计失业包括养老金范围,因为四儿子有金山银山还有三分地。农民有土地,这是农民可以赖以农村成立社区是什么意思?很多农村驻有村委会办公室,同时也驻有社区管理委员会办公室,特别是在城市郊区的农村和街道的农村都同时设立了村委会和社区管理委员会,很多人弄不明白是怎么回事。那农村成立社区是什么意思呢农村里的剩男,为何一剩再剩呢?到底是什么原因?男女比例失调。计划生育只要一个孩子时,受封建思想影响,都拚命要男孩,等他们长大了,很难找到媳妇。一,农村姑娘远嫁,二,女孩见少,三,彩礼高,四,剩男挣钱少。我就一大龄剩男!个人亲身抖音付费直播试水,看直播要给钱了?我们应该如何思考?使劲收,最好是家人们看的话,一分钟100块钱。毕竟粉丝听话的很。毕竟人设都设计好了打PK,卖货摆错价格,怒亏2个亿回馈粉丝。没事就怼工厂,怼员工反正就是赔钱回馈粉丝。赔完还得补交税马上就要退休了,退休工资才3650元太少了,怎么办?3600不少了。我企业工龄32年,退休时退休金只有2200,涨了这么多年还不到3000。知足常乐吧!如果身体不好,这些钱也够生活了,如果身体还可以,就找一些力所能及的工作,打打工补南宁五象新区未来的发展潜力很大吗?五象新区无法成为国家级新区!!!目前看来,五象新区的潜力也就这样了。我们对比一下贵阳的贵安新区,贵安新区的面积是1700平方公里,由贵阳市的郊区和安顺市合并得来。是全国第8个国家级如果把三峡大坝加高10米,截留更多的洪水,可行吗?我国的三峡大坝,作为当今世界上最大的水利枢纽工程,位于湖北省宜昌市上游,距下游葛洲坝水电站38公里,三峡大坝全长2309米高185米,呈梯形形状,集发电旅游航运调控洪水于一身。三峡大家有经历过亲人去世吗?是怎样走出痛苦和想念的?2018年9月1日下午3点8分,我的妻子在医院里停止了呼吸。她的眼睛没有闭上,我流着泪,帮她合上了双眼。我永远失去了我最亲近的爱人,孩子永远的失去了妈妈。一位好妻子,好女儿,好姑妈
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网