服务层与DAO -为什么两者同时存在?


64

我一直在使用Java Web应用程序示例中的SpringMVC,Hibernate和某些数据库。

有几种不同的方法可以执行此操作,但是此Spring 3和hibernate集成教程(带有示例)具有模型类,视图(在jsp中)以及控制器的服务和dao类。

我的问题是,服务类和DAO类是否都做同样的事情?您为什么同时需要它们?

这是我实际使用的教程:http : //fruzenshtein.com/spring-mvc-security-mysql-hibernate/

Answers:


60

通常,DAO尽可能轻巧,并且仅用于提供与DB的连接,有时是抽象的,因此可以使用不同的DB后端。

服务层在那里提供逻辑,以对发送到DAO和客户端的数据以及从DAO和客户端发送的数据进行操作。通常,这两部分会捆绑在一起,成为同一模块,有时也捆绑为同一代码,但是您仍然会看到它们是不同的逻辑实体。

另一个原因是安全性-如果您提供的服务层与数据库无关,那么除了通过服务之外,从客户端获得对数据库的访问会更加困难。如果无法直接从客户端访问数据库(并且没有琐碎的DAO模块充当服务),那么接管客户端的所有攻击者所能做的就是尝试在攻击者获取除服务器之外的所有内容之前入侵服务层。最方便的数据访问方式。


1
我同意将服务层和dao层以及包含业务逻辑的服务层分开。
Peter Delaney 2015年

40

我是有关帖子的作者。我在不同技术和不同体系结构上的工作有相当一部分。基于以上所述,我可以肯定地说拥有服务层和dao层始终是一个好主意。DAO应该仅限于仅向数据库中添加/更新/插入/选择实体对象,仅此而已。如果要在逻辑方面做任何额外的事情,请将其添加到服务层。这将有助于使代码模块化,并在替换数据库(对于数据的某些部分)时易于替换。这特别适用于涉及报表的应用程序,这些报表即使从数据库中获取数据后也具有沉重的逻辑。

同样,在春季,安全性将理想地应用于服务层。您不想更改这种方式。


5
嘿,非常感谢您回答我的问题;这就是您博客的奉献精神!感谢您的出色示例,请继续写作。
2014年

这困扰了我一段时间,我认为经验在这些情况下最有用。谢谢。
UtkuÖzdemir2014年

我同意将服务和dao层分开,并且将包含您的业务逻辑的服务层分开,并且只会调用Dao方法。当我的一种服务方法需要调用另一种服务方法时该怎么办?我应该在服务层之上有另一个抽象来调用多个服务方法吗?
彼得·德莱尼

不能。服务层的类可以相互引用(根据需要),并且可以调用所需的方法。
lokesh

11

Adam Bien在他的书中指出,JPA EntityManager是DAO的良好通用实现这一事实:

http://realworldpatterns.com/

在Java EE世界中,几乎不需要编写自己的DAO,因为JPA实现包括一个。您只需要编写服务层。

实施您自己的DAO层确实是15年前非常糟糕的J2EE架构的一个后遗症,但是许多人仍然感到必须这样做。这些自定义DAO层通常仅提供转发功能,这些功能在EntityManager上调用相应的方法。

因此,要回答您的问题,是的,您需要一个服务层和一个DAO,但是您只需要编写服务层即可。


2
我不确定这是否适用于Spring- 始终需要为Model制作一个自定义DAO。也许您的声明“几乎不需要编写自己的DAO”特别适用于EJB容器/应用服务器?
唐·奇德尔

1
最好编写自己的(DAO / DAOImpl),尽管它只会映射到EntityManager-那是因为将来您可以添加另一个DAO实现,而无需更改服务层代码
ahmednabil88 '18年

@YajliMaclo有什么区别要更改?
Alex78191

4

我通常将所有数据库特定的代码(查询)放在DAO中,并将事务处理和业务逻辑放在服务中。这允许服务方法跨多个dao调用方法,并将其全部保留在同一事务中。在我看来,这允许跨dao更好地重用代码。


2

我发现服务层在大多数情况下会增加不必要的复杂性。从理论上讲,是为了避免在dao层中包含业务逻辑,但是最终这会导致混乱,甚至有些人因为认为它并没有增加价值而拒绝完全删除dao层。http://ayende.com/blog/4784/architecting-in-the-pit-of-doom-the-evils-of-the-repository-abstraction-layer

但是,如果您有多种业务逻辑,那么可以。这是一个好主意。 建立服务层有多重要?


3
我现在已经多次阅读Ayende的博客文章,并且无法撼动他的设计(我一度同意)的感觉,尽管忠于YAGNI的精神,但即使在开发过程中,也几乎不可避免地要花费更多的开发时间。中期而言,首先要设置层的抽象成本。我不知道他是否改变了他对整个应用程序与NHibernate之间紧密耦合的看法,因为单个应用程序查询多个SQL,NoSQL和API数据源更为普遍。
科切斯先生2013年

@LennyGodber是的,我知道您觉得IMO拥有DAO /存储库层更好,因为它具有更多的优点和缺点,因为正如您所说的那样,拥有多个数据源非常普遍
Jesus

-1

恕我直言,服务层可以视为控制器和DAO层之间的层。该服务层正是我们可以添加业务逻辑,甚至创建特定于视图需要呈现的返回对象的地方。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.