用ssh框架开发有一阵了,但还是对怎样定义pojo、dao、service这三层不太理解。只是模仿着老员工,对每个数据库表建立一个pojo,一个映射文件,一个dao(接口),一个daoImpl(实现),一个service(接口),一个service(实现),这样数据库中如果有五张表,就会相应建立30个文件,感觉很是麻烦。有时pojo上面还有抽象类,那就是35个文件。
关于领域模型的设计问题,JavaEye已经组织过n多次大规模讨论,几乎每过一段时期就会出现一次。最近出现了一个新的趋势,Craig Walls在自己的blog上面写一篇文章,介绍如何使用Spring2.0和AspectJ的新特性给domain object注入DAO依赖,即如何实现post-instantiation,请见:
http://jroller.com/page/habuma?entry=spring_2_0_vs_the
与此同时,ajoo也给出了nuts的post-instantiation方案,请见:
http://www.iteye.com/display/ajoo/Dependency+Injection+For+Rich+Domain+Model
因此,从技术手段来上说,对于Spring/Hibernate架构,Martin的Rich domin model变得可行了,那么让我们看看究竟有哪些领域模型,以及他们的优缺点:
一、失血模型
失血模型请看
http://forum.iteye.com/viewtopic.php?t=11712
中列举的第一种模型,简单来说,就是domain object只有属性的getter/setter方法,没有任何业务逻辑。
二、贫血模型
贫血模型请看
http://forum.iteye.com/viewtopic.php?t=11712
中列举的第二种模型,简单来说,就是domain ojbect包含了不依赖于持久化的领域逻辑,而那些依赖持久化的领域逻辑被分离到Service层。
Service(业务逻辑,事务封装) --> DAO ---> domain object
这种模型的优点:
1、各层单向依赖,结构清楚,易于实现和维护
2、设计简单易行,底层模型非常稳定
这种模型的缺点:
1、domain object的部分比较紧密依赖的持久化domain logic被分离到Service层,显得不够OO
2、Service层过于厚重
三、充血模型
充血模型和第二种模型差不多,所不同的就是如何划分业务逻辑,即认为,绝大多业务逻辑都应该被放在domain object里面(包括持久化逻辑),而Service层应该是很薄的一层,仅仅封装事务和少量逻辑,不和DAO层打交道。
Service(事务封装) ---> domain object <---> DAO
这种模型的优点:
1、更加符合OO的原则
2、Service层很薄,只充当Facade的角色,不和DAO打交道。
这种模型的缺点:
1、DAO和domain object形成了双向依赖,复杂的双向依赖会导致很多潜在的问题。
2、如何划分Service层逻辑和domain层逻辑是非常含混的,在实际项目中,由于设计和开发人员的水平差异,可能导致整个结构的混乱无序。
3、考虑到Service层的事务封装特性,Service层必须对所有的domain object的逻辑提供相应的事务封装方法,其结果就是Service完全重定义一遍所有的domain logic,非常烦琐,而且Service的事务化封装其意义就等于把OO的domain logic转换为过程的Service TransactionScript。该充血模型辛辛苦苦在domain层实现的OO在Service层又变成了过程式,对于Web层程序员的角度来看,和贫血模型没有什么区别了。
四、胀血模型
基于充血模型的第三个缺点,有同学提出,干脆取消Service层,只剩下domain object和DAO两层,在domain object的domain logic上面封装事务。
domain object(事务封装,业务逻辑) <---> DAO
似乎ruby on rails就是这种模型,他甚至把domain object和DAO都合并了。
该模型优点:
1、简化了分层
2、也算符合OO
该模型缺点:
1、很多不是domain logic的service逻辑也被强行放入domain object ,引起了domain ojbect模型的不稳定
2、domain object暴露给web层过多的信息,可能引起意想不到的副作用。
在这四种模型当中,失血模型和胀血模型应该是不被提倡的。而贫血模型和充血模型从技术上来说,都已经是可行的了。但是我个人仍然主张使用贫血模型。其理由:
1、参考充血模型第三个缺点,由于暴露给web层程序拿到的还是Service Transaction Script,对于web层程序员来说,底层OO意义丧失了。
2、参考充血模型第三个缺点,为了事务封装,Service层要给每个domain logic提供一个过程化封装,这对于编程来说,做了多余的工作,非常烦琐。
3、domain object和DAO的双向依赖在做大项目中,考虑到团队成员的水平差异,很容易引入不可预知的潜在bug。
4、如何划分domain logic和service logic的标准是不确定的,往往要根据个人经验,有些人就是觉得某个业务他更加贴近domain,也有人认为这个业务是贴近service的。由于划分标准的不确定性,带来的后果就是实际项目中会产生很多这样的争议和纠纷,不同的人会有不同的划分方法,最后就会造成整个项目的逻辑分层混乱。这不像贫血模型中我提出的按照是否依赖持久化进行划分,这种标准是非常确定的,不会引起争议,因此团队开发中,不会产生此类问题。
5、贫血模型的domain object确实不够rich,但是我们是做项目,不是做研究,好用就行了,管它是不是那么纯的OO呢?其实我不同意firebody认为的贫血模型在设计模型和实现代码中有很大跨越的说法。一个设计模型到实现的时候,你直接得到两个类:一个实体类,一个控制类就行了,没有什么跨越。
分享到:
相关推荐
IDEA自带的插件Generate POJOs.groovy 比较简陋,不能生成完整的dao/mapper,切生成的POJO没有注解。没有统一格式化,所以在此基础上进行了扩展能够简单的生成pojo/dao/mapper. 使用时选择目录后会在改目录下生成...
Controller负责接收用户请求,Service处理业务逻辑,Impl是Service的具体实现,PageModel代表视图模型,DAO(Data Access Object)用于数据库交互,Mapper则定义了DAO层与数据库之间的映射规则。 3. **生成...
本工具包"mybatis自动生成pojo-dao-mapper工具"正是为了帮助开发者更便捷地创建POJO(Plain Old Java Object)、DAO(Data Access Object)和Mapper接口,从而减少手动编写这些重复代码的工作量。 在Java开发中,...
mybatis 自动生成 pojo mapper dao 层配置文件
在本项目中,"mybatis最终工具+pojo+dao+mapper一键生成" 提供了一个自动化工具,能够快速生成MyBatis相关的实体类(POJO)、数据访问对象(DAO)以及映射器接口(Mapper)等核心组件,极大地提高了开发效率。...
在这个"JDBCTemplate+JavaPOJO实现通用DAO"的项目中,我们将探讨如何利用这两者构建一个通用的DAO层。 首先,Java POJO(Plain Old Java Object)是指那些没有特殊约束的简单Java对象,通常用于表示数据库中的实体...
MyBatis Generator(MBG)是一款强大的工具,用于在Java项目中自动生成POJO(Plain Old Java Object)、DAO(Data Access Object)层以及Mapper接口和XML配置文件。它基于逆向工程,可以从数据库中的表信息自动创建...
由于MyBatis属于一种半自动的ORM框架,所以主要的工作将是书写Mapping映射文件,但是由于手写映射文件很容易出错,所以查资料发现有现成的工具可以自动生成底层模型类、Dao接口类甚至Mapping映射文件。
service接口 package com.erp.service; import com.erp.pojo.Employee;...这样只需要向dao中注入pojo的完整包名,你就能拥有一个pojo的dao,并且在你的service接口和实现类里不用写一句代码. 轻松持久化你的entity pojo
mybatis 生成 pojo mapper dao 的工具包
MyEclipse中自动生成Hibernate的POJO、DAO和hbm.xml文件 MyEclipse是一款功能强大且流行的集成开发环境(IDE),它提供了许多实用的功能来帮助开发者快速构建和维护项目。其中,MyEclipse提供了对Hibernate的支持,...
为了提高开发效率,程序员经常需要处理大量的实体类(Entity),包括POJO(Plain Old Java Object)、DAO(Data Access Object)以及对应的Service层。手动创建这些类可能会消耗大量时间,因此,"create-...
对于使用Hibernate框架的开发者来说,MyEclipse提供了自动生成POJO(Plain Old Java Object)类和对应的hbm.xml映射文件的功能,这在处理大量的数据库操作时尤其方便。下面我们将详细探讨如何在MyEclipse中实现这一...
MyBatis Generator(MBG)是一款强大的工具,用于自动生成MyBatis的Mapper接口、XML配置文件、DAO实现类以及对应的POJO实体类。这款工具极大地简化了开发过程,减少了手动编写这些重复代码的工作量,使得开发者能够...
Java中 PO VO BO DTO DAO 和 POJO 关系图
在Java开发中,POJO(Plain Old Java Object)类是一种简单的对象模型,通常用于表示数据库中的实体或业务逻辑中的对象。POJO类不依赖于任何框架,但当我们使用ORM(Object-Relational Mapping)框架如Hibernate时,...
在IT行业中,数据库是存储和管理数据的核心工具,而DAO(Data Access Object)层、POJO(Plain Old Java Object)以及SQL(Structured Query Language)则是Java Web开发中的关键概念。本话题将深入探讨如何根据...
本工具利用Druid的SqlParser模块,针对`CREATE TABLE`语句,能够自动化地生成对应的Java POJO(Plain Old Java Object)类和DAO(Data Access Object)类,极大地提高了开发效率。 首先,我们来了解Druid的Sql...
mybatis自动生成mapper、pojo、dao文件-附件资源