JavaWeb项目分层理念

一、背景

  从08年进入Java世界以来,初出茅庐,Java为网络而生,为并发而生。网络应用编程,自然涉及到MVC分层模型,谈起分层模型,大部分都会认为,很简单嘛,无非就是Controller、Service、Dao三层。看起来简单,很多人其实并没有把他们指责划分开,在很多代码中,controller做的逻辑比service还多,service往往当成dao的桥梁,透明传输,这其实是很多人开发都没有注意到的地方,反正业务流程能跑,功能可用,至于放哪里无所谓。这样往往造成后面代码无法服用,层级关系混乱,对后续代码的维护非常麻烦。的确在这些开发人员中分层只是一个形式,前辈们的代码这么写的,其他项目代码也这么写,那么我也跟着这么写(此中涉及到人的惯性思维,好比第一次开会你选中某个座位,休息后你还会选中此座位)。但是在真正的团队开发中每个人的习惯都不同,写出来的代码必然带着自己的标签,有的人习惯controller写大量的业务逻辑,有的人习惯在service中调用远程服务,这样就导致了每个人开发代码风格完全不同,后续其他人修改的时候,一看,我靠,这个人写的代码和我平常的习惯完全不同,修改的时候到底是按着自己的习惯,还是跟着前辈走,这个是艰难的选择,选择一旦有偏差,你的后背又维护你的代码的时候,恐怕要骂人了。

  所以,一个好的应用分层应具备以下几点:

  a、方便后续代码进行维护扩展

  b、分层的效果需要让整个团队都接受

  c、各个层,职责边界清晰

二、如何进行分层

2.1在规范中约束的分层如下

  开放接口层:可直接封装Service方法暴露成RPC接口;通过web封装成链接接口;进行网关安全控制、流量控制等。

  web层:主要是对访问控制进行转发,各类基本参数校验,各个端的模板渲染,主要是js渲染,JSP渲染,移动端展示等。

  service层:相对具体的业务逻辑服务层。

  manager层:通用业务处理层,它有如下特征:1、对第三方平台封装的层,预处理返回结果以及转化异常信息;2、对service层通用能力的下沉,如缓存方案、中间件通用处理;3、与dao层交互,对多个dao组合复用;

  DAO层:数据访问层,与底层MySQL、Oracle、mangodb进行数据交互。

注:service层和manager层有很多同学还是有点分不清楚之间的关系,就导致了很多项目中根本没有manager层的存在。下面介绍一下具体业务中应该如何实现分层。

2.2优化分层

  从我们的业务开发中总结了一个较为理想的模型,这里要先说明下由于我们的rpc框架选用的dubbo可能会比其他的一些rpc框架例如dubbo会多出一层,作用和controller层类似

 1、最上层controller和ThirdController使我们分层规范里面的第一层:轻业务逻辑,参数校验,异常兜底。通常这种接口可以轻易更换接口类型,所以业务逻辑必须要轻,甚至不需要做具体逻辑。

  2、Service:业务层,复用性较低,这里推荐每一个controller方法都对应一个service,不要把业务编排放在controller中去做,为什么呢?如果我们把业务逻辑放在controller层去做的话,以后我们要接入第三方服务接口,我们这里又需要把业务编排再做一次,这样会导致我们每接入一个入口层这个代码都得重新复制一份如下图所示

这样大量的重复工作必定会导致我们开发效率下降,所以我们需要把业务编排逻辑都得放进service中去做

  3、Manager:可复用逻辑层。这里的manager可以是单个服务的,比如我们的cache,mq等等,当然可以是符合的,当你需要调用多个manager的时候,这个可以合为一个manager,比如逻辑上的连表查询等。如果是httpMannager或rpcMannager需要在这里坐一层数据转换

  4、DAO:数据库访问层。主要负责“操作数据库的某张表,映射到某个Java对象”,dao应该只允许自己的service访问,其他service要访问我的数据必须通过对应的service。

三、分层领域模型的转换

 编码规约中列举以下几个领域模型:

 DO(Data Object):与数据表结构一一对应,通过DAO层向上传输数据源对象。

 VO/DTO(Data Transfer Object):数据传输对象,Service或manager向外传输的对象,提高复用继承自BO。

 BO(Business Object):业务对象,由service层输出的封装业务逻辑对象,提高复用继承自BO。  

层次领域模型备注
Controller/ThridControllerVO/DTO继承DO
Service/ManagerBO继承DO
DAODO 

 

 

 

 

 

 

  每一个层基本都按照对应的领域模型,这样导致了一个对象可能会出现3次甚至4次转换在一次请求中,当返回的时候同样也会出现3-4次转换,在开发中写这样的重复逻辑,那还是算了。

 所以我们采取一个折中的方案

 1、允许service/manager可以操作数据领域模型,对应这个层级来说,本来自己做的工作也是业务逻辑处理和数据组装。

  2、Controller/ThirdController层的领域模型不允许传入DAO层,这样就不符合职责划分了。

  3、同理,不允许DAO层的数据传入到Controller/ThirdController。

 总的来说,业务分层对于代码规范是比较重要,决定着以后代码是否可复用,是否职责清晰,边界清晰。

 

 

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值