广东快乐十分注册

一、工程结构

作者:admin    发布时间:2019-03-28 15:36     浏览次数 :

[返回]

  本系列文章所示范的项目基于传统三层架构进行分层,基于工作职责和Maven结构进行模块划分。本文将对传统三层架构和对应的领域模型架构、以及每个模块的职责进行简单的说明。下图即示范项目的模块结构:

  传统三层架构是一种软件架构,是一种典型的、基于贫血模型的、面向过程的JavaWeb分层方式。该架构分为以下三个层次:

  分层的目的是为了解耦和明确责任。开发人员可以只关心自己所负责的那一层,因为他只需要知道上一层提供了哪些接口,从而利用这些接口进行编程。而上一层的开发人员在不改变接口的情况下,可以任意地替换具体的实现,从而实现松耦合。

  相比更传统的架构,三层架构有着明显的优势,但也有不可忽视的缺点。初期的JavaWeb在JSP内同时进行数据库读写、业务逻辑处理和页面渲染,简单而暴力。而今的架构,在JSP之上增加了一个处理业务逻辑的中间层和一个封装了数据库操作的数据访问层,毫无疑问造成了代码量的大幅度上升和效率的下降。

  本项目中,Mybatis承担数据访问的责任;SpringMVC包揽了页面渲染和请求调度;Spring的IoC和AOP组成了整个项目的支架;Spring的事务控制为业务逻辑层的一致性提供了强有力的保障。

  不同的语言、不同的框架对三层架构有不同的演绎,但殊途同归,业务数据的流向是一致的。下面以一个点菜的例子来示范这一点:

  每个软件程序的目的都是为了执行某项活动,或是满足用户的某种需求。用户会把软件程序应用于某个主题区域,这个区域就是软件的领域。一些领域涉及物质世界,例如机票预订程序的领域中包括飞机乘客在内。有些领域则是无△▪▲□△形的,例如会计程序的金融领域。

  如图,该架构分为界面(Interfaces)、应用(Application)和领域(Domain)三层,以及一个基础设施(Infrastructure),是一种基于充血模型的、面向对象的分层方式。其各层职责如下:

  负责所有与外部系统的交互,包括WebService、RMI或REST等。包括外观(Facade)、装配(Assembler)和数据传输对象(DTO)三类组件:

  因为领域对象不适合暴露给用户,因此需要在返回给用户之前,重新封★▽…◇装为DTO,只暴露我们希望暴露的内容。同时,DTO还有减少请求的次数、简化传输对象、避免代码重复等作用。

  正如其字面上的含义,Assembler是一个装配◆◁•工人,负责DTO与领域对象的转换。

  Facade是★◇▽▼•外观模式的践行者,作用与传统三层架构的Controller类似,负责将一个或多个service方法组合起来,然后封装为一个接口提供为外部系统。换句话说,他负责将外部请求委派给一个或多个service进行处理。他本身不处理任何业务逻辑。

  应用层的主要组件就是Service,其粒度与传统三层架构的service一致。差别在于,传统三层架构的service层负责业务逻辑的处理,而领域模式三层架构的service只负责将业务委派给领域对象进行处理。

  这一层是整个软件的核心,几乎包括了所有的业务逻辑。他包括了Entity(实体)、Value Object(值对象)、Domain Event(领域事件)和Repository(仓储)等领域组件。下面以时下很火的共享自行车为例来简单解释这几个组件:

  实体是一个在业务领域有着唯一标识的对象。实体有属性和状态,有业务行为,其业务行为会影响他的属性和状态。而值对象呢,用于描述没有唯一标识的对象。

  举个栗子,当我们希望对每一辆共享自行车进行管理时,他应该被设计为实体,有唯一编号作为标识,有颜色、重量、价格、品牌等属性,有位置状态、使用状态,有租赁行为。当其被租赁时,其位置状态和使用状态可能发生改变。

  同样是共享自行车,如果我们的系统只为了统计各地区各品牌自行车的使用情况,即我们只关心他是什么,而不关心他是谁,那么他应该被设计为值对象。

  简★△◁◁▽▼单的说,实体触发事件,实体绑定事件。用户的租赁行为会触发租赁事件;而自行车绑定了租赁事件,当事件发生时,自行车的使用状态发生改变。

  作为基础设施,Infrastructure负责给三层架构提供支持。所有与具体平台、框架相关的实现都会在这一层实现,以免影响三层架构职责的纯粹性、以及污染领域模型。对象持久化的具体实现也放在基础设施里。

  从领域模型架构各层的职责可以看出,他和传统三层架构最大的差别在于,领域模型架构的业务逻辑包含在领域模型里,而传统三层架构的业务逻辑在Service层。为了实现这一点,领域模型还引入了在Javascript和Ac•□▼◁▼tionScript中常见的事件机制;而传统三层架构中,领域模型的属性和行为严格分离,变成了POJO和Service。

  个人认为,两种架构的出发点是相同的,一样是先挖掘领域概念,然后建模,再根据模型进行设计。差别在于,当业务逻辑的复杂程度在单个开发人员或单个团队的把控能力范围之内时,采用面向过程的传统三层架构可以很快地完成建模工作,并开始业务逻辑的设计;而当业务逻辑复杂到一定程度时,则有必要花更多的时间用在建模上,去抽取模型的行为,去设计和关联模型事件,以期在后续迭代中,开发人员只需面对一个个可以清晰地理解的领域对象,而不是一坨动辄上千行的某业务行为的逻辑代码。

  不同的架构、不同的层、不同的应用场景中有着不一样的建模需求,因此表述相同概念的模型可能会有不同的“形态”,例如:

  失血模型 - 传统三层架构中只有get/set方法,没有业务逻辑的POJO对象。

  PO - Persistant Object,持久化对象,即DAO从JDBC取出来的对象。传统三层架构中,PO即POJO组件中的对象,存在于DAO和Service之间。

  DO - Domain Object,领域对象。领域模型架构中,PO从数据库取出来后,有一个“重建”的概念,即根据数据还原实体,这个被还原的实体就是DO,存在于DAO和Service之间。

  DTO - Data Transfer Object,数据传输对象。上面在领域模型架构的界面层提过。对传统三层架构来说,该对象存在于Service和Controller之间。PO到DTO的转换可以在service实现,也可以在controller实现。本教程在Service进行转换。

  VO - View Object,视图对象。Controller在返回DTO给视图时,可能还需要包括状态信息—例如操作成功/失败的状态吗、提示文本等—这时就需要在DTO外面再包一层,即View O◇=△▲bject。该对象存在于Controlle●r和Web之间,由Controller进行装配。

  跟架构密切相关的另一个词汇是MVC模型,即Model-View-Controller模式。MVC模式是一种设计软件的模式,不是一种架构。在传统三层架构中,MVC的理念被应用在表现层:View提交请求数据给Controller,Controller返回数据用于渲染View,两者之间以Model(VO - ViewMod◆■el)的形式进行通信。如下图:

  注:下文中提到的Parent(父模块)和Aggregator(聚合器)概念会在后续章节讲解。

  第三方服务相关的参数可以硬编码在代码内,也可以放在study-web模块的resources中,交由spring进行初始化。

  POJO即Plain Old Java Objects,简单的JavaBean,即对对象实体的封装,只有属性和get/set方法。POJO中的实体还可以称为PO(Persistant Object- 持久化对象)。我们把内存中的临时数据存储到存储设备上变成永久数据的过程叫做持久化。对于需要进行持久化操作的▪▲□◁对象,我们称之为持久化对象。Hibernate中把持久化对象的生命周期分成三种:

  临时状态 - 刚创建出来,还未持◆▼久化的状态。此时该对象不在session缓存中,数据库中也没有相应的记录。

  持久化状态 - 已经被持久化,且在session缓存中的状态。对该状态下对象的修改会由Hibernate同步反映到数据库中。

  游离状态 - 已经持久化但不在session缓存中的状态。对该状态下对象的修改不会反映到数据库中,除非手动调用相关方法使之回到持久化状态。

  然而Mybatis并未对对象的生命周期进行管理,更不会有持久化状态。但我们根•●据是否已进行持久化操作,将对象状态粗分为临时状态和游离状态。

  Mybatis将它的DAO对象(Data Access Object- 数据访问对象)称为Mapper -映射器,每个映射器包含了一个Map★-●=•▽per接口类和一个XML映射配置文件。其中,XML映射配置文件包含了SQL代码和映射定义信息(也可以通过注解直接写在接口类中,但不推荐)。

  Mybatis的映射器都放在这个模块里。该模块只负责数据的CRUD操作,不管业务逻辑。数据访问对象不限于数据库数据源。

  service就是三层架构的业务逻辑层,也有biz(business的缩写)这种叫法。业务逻辑层是三层架构中最为厚重的一层,所有跟具体业务相关的环节都在这里完成。

  biz是对业务逻辑的更细粒度划分,但又有别于DAO对数据库的原子性操作,目的在于抽象出业务逻辑的公共部分,更好地实现代码复用。

  service即对外暴露的接口。借用悠然大神的例子,biz层的许多东西是不适合对外的,好比厨师炒菜,你看了炒菜的过程估计吃不下去。但是让service层包装一下,让漂亮的服务员端上来就好多了。

  上文介绍了为什么要做好代码架构设计,接下来本文将为大家介绍两种常用的web service的代码架构。 在开始介绍这两种代码架构之前,先来回答一个问题:什么样的代码架构才是好的代码架构? 好...

  首先给大家引入下MVC的概念: MVC(Model View Controller)模型、视图以及控制器,它是一种较为广泛应用的结构设计模式。 模型:就是在MVC设计模式中需要被显示的数据。在通常情▼▼▽●▽●况下,该模型...

  前言 上篇文章小编提到了什么是javaEE和它的13个核心规范,本篇文章,小编带您走进JavaEE的体系结构,从两层架构,三层架构,MVC,基于Ja□◁vaEE架构模式下的MVC,JavaEE的四层架构。 两层架构 ...

  一.概述 本篇继续探讨web应用架构,讲基于DDD风格下最初的领域模型架构,不同于DDD风格下CQRS架构,二者架构主要区别是领域层的变化。 架构的演变是从领域模型到CQRS, 一开始DDD是用领域...

  Hibernate的懒加载 所谓懒加载(lazy)就是延时加载,延迟加载 延迟加载是一种○▲-•■□机制,主要是解决不必要的查询对资源的浪费,只有当数据真正调用时才加载,而不会对数据进行提前加载造成资源的...

  Kubernetes高可用也许是完成了初步的技术评估,打算将生产环境迁移进Kubernetes集群之前普遍面临的问题。 为了☆△◆▲■减少因为服务器当机引起的业务中断,生产环境中的业务系统往往已经做好了高可用...

广东快乐十分注册