本节书摘来自异步社区《精通Spring MVC 4》一书中的第2章,第2.2节,作者:【美】Geoffroy Warin著,更多章节内容可以访问云栖社区“异步社区”公众号查看
2.2 对MVC的质疑及其最佳实践
尽管MVC依然是当前设计UI的首选方案,但是随着它的流行,也有很多对它的批评。实际上,大多数的批评都指向了该模式的错误用法。
2.2.1 贫血的领域模型
Eric Evans编写过一本很有影响力的书,名为《领域驱动设计》(Domain Driven Design,DDD)。在这本书中,定义了一组架构规则,能够指导我们更好地将业务领域集成到代码之中。
其中有一项核心的理念就是将面向对象的范式应用到领域对象之中。如果违背这一原则的话,就会被称之为贫血的领域模型(Anemic Domain Model)。
贫血的领域模型通常来讲会具有如下的症状:
模型是由简单老式的Java对象(plain old Java object,POJO)所构成的,只有getter和setter方法;
所有业务逻辑都是在服务层处理的;
对模型的校验会在本模型外部进行,例如在控制器中。
根据业务领域的复杂性不同,这可能是一种较差的实践方式。通常来讲,DDD实践需要付出额外的努力,将领域从应用逻辑中分离出来。
架构通常都是一种权衡,需要注意的是,设计Spring应用的典型方式往往会在这个过程中导致系统在可维护性上变得较为复杂。
避免领域贫血的途径如下:
服务层适合进行应用级别的抽象(如事务处理),而不是业务逻辑;
领域对象应该始终处于合法的状态。通过校验器(validator)或JSR-303的校验注解,让校验过程在表单对象中进行;
将输入转换成有意义的领域对象;
将数据层按照Repository的方式来实现,Repository中会包含领域查询(例如参考Spring Data规范);
将领域逻辑与底层的持久化框架解耦;
尽可能使用实际的对象,例如操作FirstName类而不是操作String。
DDD所涉及的内容远不止上述的规则:实体(Entity)、值类型(value type)、通用语言(Ubiquitous Language)、限界上下文(Bounded Context)、洋葱架构(Onion Architecture)以及防腐化层(anti corruption layer),我强烈建议你自行学习一下这些原则。就我们而言,在构建Web应用的过程中,会努力遵循上述的指导原则。随着本书的推进,你会对这些关注点更加熟悉的。
2.2.2 从源码中学习
如果熟悉Spring的话,那么很可能你已经访问过Spring的Web站点,即http://spring.io。它全部是由Spring构建的,而且很棒的一点在于它是开源的。
这个项目的名称为sagan,它包含了很多有意思的特性:
基于Gradle的多模块项目;
集成了安全;
集成了Github;
集成了Elasticsearch;
JavaScript前端应用。
这个项目的Github wiki页面非常详尽,能够帮助你非常容易地开始了解该项目。