论坛首页 Java企业应用论坛

在项目架构中如何进行分层才是最合理的?

浏览 48565 次
精华帖 (2) :: 良好帖 (0) :: 新手帖 (17) :: 隐藏帖 (1)
作者 正文
   发表时间:2008-09-23  
我同意楼主的观点。简单就好
0 请登录后投票
   发表时间:2008-09-23  
fish2007 写道
  DAO层为什么作为可选层呢? 你把对数据库的访问和逻辑的处理都放在service层, 不觉得很乱吗。
  对于接口,DAO层的接口,我觉得是可选的,但是service层的接口还是有必要的。在项目中,有很多不期而遇的变化,当你使用了接口,那么你的实现类的变化,就不会对外界产生任何影响。


处理逻辑应该放在service层吧。
访问数据应该放在DAO层,但访问什么样的数据还是应该有service决定吧,DAO应该只是执行而已,并对执行结果进行一定的转换。这样DAO整个系统就只有一个啊,不需要每个service都对应一个DAO。而且这一个DAO对外提供的是一个接口,具体内部是用JDBC还是hibernate,service不需要关心。
0 请登录后投票
   发表时间:2008-09-23  
chen-516888 写道
.................
Spring AOP对接口的动态代理类是通过Java Reflection 生成的
如果只是对类生成动态代理类,则使用CGLIB,效率稍微会低一些.

接口和实现分开是为了实现抽象化和实现的分离,使得实现可以动态的改变
你的应用中不需要考虑这样的问题,不代表这样不好

至于能不能"去掉",视具体情况而定吧.完全的话...个人觉得太绝对了

你的DAOImpl如果是基于MySQL和一些特有的东西,有一天你的系统数据库
迁移到Oracle,并且使用了Oracle的一些特性,只需要实现新的DAOImpl代替
原来的DAOImpl就可以了.如果没有接口和实现的分离,就很麻烦了,
可能需要大量修改业务层的代码.
个人拙见




请问,这个DAOImpl在整个系统中是不是只有一个。还是像楼主的图中那样,一个service对应一个dao?谢谢。
0 请登录后投票
   发表时间:2008-09-23  
chen-516888 写道
.................
Spring AOP对接口的动态代理类是通过Java Reflection 生成的
如果只是对类生成动态代理类,则使用CGLIB,效率稍微会低一些.

接口和实现分开是为了实现抽象化和实现的分离,使得实现可以动态的改变
你的应用中不需要考虑这样的问题,不代表这样不好

至于能不能"去掉",视具体情况而定吧.完全的话...个人觉得太绝对了

你的DAOImpl如果是基于MySQL和一些特有的东西,有一天你的系统数据库
迁移到Oracle,并且使用了Oracle的一些特性,只需要实现新的DAOImpl代替
原来的DAOImpl就可以了.如果没有接口和实现的分离,就很麻烦了,
可能需要大量修改业务层的代码.
个人拙见




太理想化了,一般来说从mysql迁移到oracle,改动的比这个多的多,基本和数据库打交道的都要重写。
0 请登录后投票
   发表时间:2008-09-23  
确实,Action+Service+Dao让人难受,如果有增加功能接口的话,上上下下都得改,针对比较简单的项目,我会把Service+Dao合并,就让Mmodel和Controler用一个类来实现,中间辅以业务接口,也能体现MVC的思想!
如今看看Seam,确实受启发,连Entity都可以充当VO了,那么SessionBean完成Model+Controler的功能也就能接受
0 请登录后投票
   发表时间:2008-09-23  
我是觉得,分成Action,Service,Dao的思想的主要原因是DAO主要完成单表的一些增,删,改,主要给Service调用(重用了),Service代表着业务操作,Facade就是在这里起作用,更重要的是,事务必须起停在业务操作中
0 请登录后投票
   发表时间:2008-09-23  
有这种标准。。。  可以工厂化吧!~~ 
0 请登录后投票
   发表时间:2008-09-23  
没有什么最合理,,根据领域 业务不同,,划分不同的层.
0 请登录后投票
   发表时间:2008-09-23  
我觉得接口还是必要的,而且分层也是必要的,接口易于扩展,

service是和业务有关,dao是和数据处理有关
0 请登录后投票
   发表时间:2008-09-23  
chen-516888 写道
.................
Spring AOP对接口的动态代理类是通过Java Reflection 生成的
如果只是对类生成动态代理类,则使用CGLIB,效率稍微会低一些.

接口和实现分开是为了实现抽象化和实现的分离,使得实现可以动态的改变
你的应用中不需要考虑这样的问题,不代表这样不好

至于能不能"去掉",视具体情况而定吧.完全的话...个人觉得太绝对了

你的DAOImpl如果是基于MySQL和一些特有的东西,有一天你的系统数据库
迁移到Oracle,并且使用了Oracle的一些特性,只需要实现新的DAOImpl代替
原来的DAOImpl就可以了.如果没有接口和实现的分离,就很麻烦了,
可能需要大量修改业务层的代码.
个人拙见



有过测试,CGLIB效率其实比java动态代理更高,因为CGLIB是bytecode生成技术,而动态代理是纯反射。
但对于spring来讲这些都不怎么重要,DAO本来就是单例,而且反射浪费的那一点点时间相对别的操作可以忽略,正如你已经跑了5000米了,还在乎多跑一米吗。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics