当前位置: 首页 > 面试题库 >

为什么在服务层和dao层中始终只有单个实现接口?

钦良弼
2023-03-14
问题内容

我已经工作/见过一些Spring-Hibernate Web应用程序项目,这些项目具有与实际服务和dao类一样多的接口。

我一直认为这是拥有这些单一实现接口的主要原因:

  1. Spring可以将实际实现连接为给定类中的依赖项(松耦合)

    public class Person { 
    @Autowired 
    private Address address;
    
    @Autowired 
    private AccountDetail accountDetail;
    
    public Person(Address address, AccountDetail accountDetail) 
    { // constructor
    
  2. 在进行单元测试时,我可以创建模拟类并单独测试一个类。

    Address mockedAddress = mock(Address);
    

    AccountDetail mockedAccountDetail = mock(AccountDetail);
    Person underTestPerson = new Person(mockedAddress, mockedAccountDetail);
    // unit test follows

但是,最近,我意识到:

Spring可以将具体的实现类连接为依赖项:

public class Person {

@Autowired 
private AddressImpl address;

@Autowired 
private AccountDetailImpl accountDetail;

public Person(AddressImpl address, AccountDetailImpl accountDetail) { 
// constructor

像EasyMock这样的模拟框架也可以模拟具体的类

AddressImpl mockedAddress = mock(AddressImpl);
AccountDetailImpl mockedAccountDetail = mock(AccountDetailImpl);
Person underTestPerson = new Person(mockedAddress, mockedAccountDetail); 
// unit test follows

此外,根据本次讨论,我认为摘要是,在单个应用程序中,界面大多被过度使用,可能出于惯例或习惯。在我们与另一个应用程序接口的情况下,例如,世界上许多应用程序使用的slf4j,它们通常是最有意义的。在单个应用程序中,类几乎与接口一样抽象。

因此,我的问题是,为什么我们仍然需要接口,然后拥有诸如 ServiceImpl和
DaoImpl类之类的单一实现,而不必要地增加了代码库的大小。在嘲笑我不知道的具体类时是否存在一些问题。

每当我与队友讨论这个问题时,我唯一得到的答案就是,每个人都遵循基于接口实现服务和dao类的设计-
每个人都提到了关于弹簧的最佳实践,OOP,DDD等。但是我仍然没有在孤立的应用程序中拥有如此多的接口背后得到了一个务实的理由。


问题答案:

接口还有更多优点-如代理中那样。如果您的类实现了接口,则默认情况下,AOP将使用JDK动态代理。如果直接使用实现,则必须通过使proxy-target-
class = true来强制使用CGLIB代理。与JDK代理不同,它们需要字节码操作。

在这里阅读更多内容。



 类似资料:
  • 在我的示例中,我有一个Hibernate实体和一个DAO。 当我以这种方式使用DAO时 数据库中只保存了一行(Action2)。当我删除注释时,两行(Action1和Action2)都被保存(这是我需要的行为)。我的问题是服务层上的事务注释如何影响事务(方法executeTransaction())的执行。为什么没有服务层上的事务性注释,这两行都保存在数据库中,而只有最后一行与此注释一起保存?

  • 问题内容: 如果我的Dao层抛出了Dao特定的异常,那么在我的服务层中对它们的处理是否会引起关注的泄漏?如果是,那么我应该使异常通用且独立于任何层来解决它,还是有其他方法吗? 相同的问题适用于服务层引发的UI层处理异常。 问题答案: 当我们创建一个分层的应用程序时,总是有一个用户层和另一个使用过的层。对于这种情况,UI层->使用服务层->使用DAO层。 现在,它非常主观并且易于解释。但目标应该是

  • 问题内容: 我试图弄清楚为什么在他提供的示例中首先需要服务层。如果你将其取出,则可以在客户中执行以下操作: 似乎服务层只是DAO的包装。有人可以给我一个情况,如果服务层被删除,情况可能会变得一团糟?我只是看不到拥有服务层的意义。 问题答案: 让服务层成为DAO的包装是一种常见的反模式。在你提供的示例中,它肯定不是很有用。使用服务层意味着你将获得以下好处: 你需要在控制器中最好完成的Web类型活动和

  • 问题内容: 我正在设计一个基于JPA / Hibernate,Spring和Wicket的新应用。我对DAO和Service层之间的区别还不清楚。根据维基百科,DAO是 一个为某种类型的数据库或持久性机制提供抽象接口的对象,提供某些特定的操作而不公开数据库的详细信息。 我想知道DAO是否可以包含与数据访问无关的方法,但是使用查询执行起来会更容易吗?例如,“获取在一组特定机场上运营的所有航空公司的列

  • 问题内容: 我目前正在使用带有Spring插件和hibernate的Struts2开发一个Web应用程序,并且在查看在线示例时,我看到了Service和DAO层的使用,现在才知道Service和数据访问对象层的真正用途是什么?如果服务层只是在调用DAO层的方法来执行CRUD操作。直接调用DAO层方法不明智吗? 假设此示例为Dao和Service Layer 人员服务 人道 我的问题是,如果仅将服务

  • 问题内容: 首先,可能是我要问一些以前已经问过并回答过的问题,但我却无法找回搜索结果。一般而言(或到目前为止):)我们在服务层上定义事务注释,通常是Spring Hibernate Crud。 现在,我需要根据客户站点在域模型之间进行选择。假设客户端A使用我的域模型都很好,但是另一个客户端网站会给我一个Web服务而不是使用我们的域模型。 我应该替换哪一层。我认为必须是DAO,它将从Web服务获取我