2012-04-05 79 views

回答

41

没有区别尽量就像春天一样。按照惯例,您可以使用@Repository标记DAO类,并使用@Service标记服务。前者也进行一些持久层异常翻译。

由于您在理论上提出:DAO应该执行原始数据库操作并将它们转换为一些更高级别的构造(对象,集合)。服务应该调用DAO并执行业务操作。通常,在服务层上执行事务分界以跨越几个DAO调用。

最后,DAO应该将业务逻辑从持久性细节中抽象出来,理想情况下允许在没有业务逻辑(服务)更改的情况下切换持久层。由于泄漏了持久化提供者的抽象(例如延迟加载),所以这几乎不可能。

10

DAO - 数据访问对象,是处理与数据存储(典型数据库)连接的对象。你在这里有你的查询和DAO提供数据给你的服务。

服务应该包含您的所有逻辑。如果你有逻辑分离,你理论上可以改变你的UI层或DAO层,而不会影响它。

4

DAO(数据访问对象)是一种设计模式,其由上创建的数据库中的类上的每个表中,提供了一种技术,用于分离对象的持久性和数据访问逻辑

0

虽然已经问了这个问题已经很多年了,但还是有人(像我一样)想知道这个问题的答案。除了上面的答案,我想分享我发现的东西:

在为Spring学习者编写的许多基本的基于Spring的代码中,数据只是从数据库存储和读取。 DAO注入SessionFactory。然后我们看到服务似乎在做同样的事情。新的学习者想知道为什么我们有两个类似的界面和类 - dao和服务。

但是在真实世界的应用程序中,可以存在其他并行类型的数据存储(例如,一种数据可以存储在数据库中,而一些其他类型的数据存储在文件或其他存储类型中可以用于给定的时间点)。

而在这种情况下,控制器类将不得不注入许多不同类型的接口(一个使用数据库,其他使用文件和其他一些接口)。如果有移动应用程序使用相同的数据源,那么移动应用程序也会设置所有不同类型的数据源。

所以不要这样做,当使用服务时控制器类,移动应用程序等只能使用服务,服务可以与我们拥有的任意数量的数据持久性源一起工作。当在数量或数据源的持久性改变所有也将在受影响的DAO和服务,因此,控制器,移动应用做等将不会受到影响类型的改变

后来 - 他们将继续使用相同的服务。

所有这些都明显减少了要完成的工作量。

有一个门面设计模式,推荐这样的设置作为更好的设计。

您可以这篇大文章中看到的这个伟大的图形表示:

https://springframework.guru/gang-of-four-design-patterns/facade-pattern/

所以,尽管在基本春基于应用与一个数据源正在使用的唯一的Web应用程序的用户(控制器)在真实DAOs和Service之间的生活情景区分变得明显。

希望这会有所帮助。