为什么service层和dao层总是有单一的实现接口?

2024-02-10

我工作过/见过一些 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

另外,根据this https://stackoverflow.com/questions/90851/is-it-just-me-or-are-interfaces-overused讨论中,我认为总结是,在单个应用程序中,界面大多被过度使用,可能是出于惯例或习惯。当我们与另一个应用程序交互时,它们通常最有意义,例如世界各地许多应用程序使用的 slf4j。在单个应用程序中,类几乎与接口一样是抽象。

所以,我的问题是为什么我们仍然需要接口,然后有像 *ServiceImpl 和 *DaoImpl 类这样的单一实现,并不必要地增加我们的代码库大小。模拟具体类是否存在我不知道的问题。

每当我和我的队友讨论这个问题时,我得到的唯一答案是基于接口实现服务和 dao 类是每个人遵循的设计 - 他们提到 Spring 最佳实践、OOP、DDD 等。但我仍然不知道在一个独立的应用程序中拥有如此多的接口背后有一个务实的理由。


接口还有更多优点——就像代理一样。如果您的类实现了接口,则 AOP 将默认使用 JDK 动态代理。如果直接使用实现,您将被迫通过设置 proxy-target-class=true 来使用 CGLIB 代理。与 JDK 代理不同,这些需要字节码操作。

read here http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/aop.html#aop-understanding-aop-proxies了解更多相关信息。

阅读另一个讨论:使用接口(Java EE 或 Spring 和 JPA)的原因是什么 https://stackoverflow.com/questions/8894883/what-reasons-are-there-to-use-interfaces-j2ee-or-spring-and-jpa/8895009#8895009了解更多信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么service层和dao层总是有单一的实现接口? 的相关文章

  • 无法使用maven编译java项目

    我正在尝试在 java 16 0 1 上使用 maven 构建 IntelliJ 项目 但它无法编译我的项目 尽管 IntelliJ 能够成功完成 在此之前 我使用maven编译了一个java 15项目 但我决定将所有内容更新到16 0 1
  • 为什么 java 编译器不报告 Intellij 中多播表达式的未经检查的强制转换警告?

    为什么下面的代码没有报告 Intellij IDEA 的未经检查的警告jdk 1 8 0 121自从Supplier
  • 来自数据库的 jfreechart 散点图

    如何使用java中的jfreechart绘制mysql数据库表中数据的散点图 我使用过 Swing 库 任何链接都会有帮助 我搜索了谷歌但找不到理解的解决方案 如果您有代码 请提供给我 实际上我确实做了条形图并使用 jfreechart 绘
  • python 中的代表

    我实现了这个简短的示例来尝试演示一个简单的委托模式 我的问题是 这看起来我已经理解了委托吗 class Handler def init self parent None self parent parent def Handle self
  • 在 HTTP 标头中发送 UTF-8 值会导致 Mojibake

    我想使用 servlet 发送阿拉伯语数据HTTPServletResponse给客户 我正在尝试这个 response setCharacterEncoding UTF 8 response setHeader Info arabicWo
  • 带有 @RequestBody 的 Spring 多部分文件

    我正在尝试将数据从应用程序上传到 Spring 后端服务 要上传的内容是一个 DataModel 其中包含要创建的对象的数据以及链接到该数据的多个图像 因此我使用这个方法签名 RequestMapping method RequestMet
  • 记录骆驼路线

    我的项目中有几个 Camel 上下文 如果可能的话 我想以逆向工程方式记录路线 因为我们希望保持与上下文相关的文档最新 最好的方法是什么 我们倾向于预先实际设计路线 并使用来自EIP book http www eaipatterns co
  • 如何从 Retrofit2 获取字符串响应?

    我正在做 android 正在寻找一种方法来执行超级基本的 http GET POST 请求 我不断收到错误 java lang IllegalArgumentException Unable to create converter for
  • 如何将 android.net.Uri 转换为 java.net.URL? [复制]

    这个问题在这里已经有答案了 有没有办法从Uri to URL 我正在使用的库需要这个 它only接受一个URL但我需要在我的设备上使用图像 如果该方案的Uri is http or https new URL uri toString 应该
  • 具有共享依赖项的多模块项目的 Gradle 配置

    使用 gradle 制作第一个项目 所以我研究了 spring gradle hibernate 项目如何组织 gradle 文件 并开始制作自己的项目 但是 找不到错误 为什么我的配置不起作用 子项目无法解决依赖关系 所以项目树 Root
  • Java 服务器-客户端 readLine() 方法

    我有一个客户端类和一个服务器类 如果客户端向服务器发送消息 服务器会将响应发送回客户端 然后客户端将打印它收到的所有消息 例如 如果客户端向服务器发送 A 则服务器将向客户端发送响应 1111 所以我在客户端类中使用 readLine 从服
  • 隐式超级构造函数 Person() 未定义。必须显式调用另一个构造函数?

    我正在开发一个项目 但收到错误 隐式超级构造函数 Person 未定义 必须显式调用另一个构造函数 我不太明白它 这是我的人物课程 public class Person public Person String name double D
  • 计算日期之间的天数差异

    在我的代码中 日期之间的差异是错误的 因为它应该是 38 天而不是 8 天 我该如何修复 package random04diferencadata import java text ParseException import java t
  • Spring Security OAuth2简单配置

    我有一个简单的项目 需要以下简单的配置 我有一个 密码 grant type 这意味着我可以提交用户名 密码 用户在登录表单中输入 并在成功时获得 access token 有了该 access token 我就可以请求 API 并获取用户
  • 在 Spring Boot Actuator 健康检查 API 中启用日志记录

    我正在使用 Spring boot Actuator APIproject https imobilenumbertracker com 拥有一个健康检查端点 并通过以下方式启用它 management endpoints web base
  • 对象锁定私有类成员 - 最佳实践? (爪哇)

    I asked 类似的问题 https stackoverflow com questions 10548066 multiple object locks in java前几天 但对回复不满意 主要是因为我提供的代码存在一些人们关注的问题
  • Java:拆箱整数时出现空指针异常?

    此代码导致空指针异常 我不知道为什么 private void setSiblings PhylogenyTree node Color color throws InvalidCellNumberException PhylogenyTr
  • Android - 9 补丁

    我正在尝试使用 9 块图片创建一个新的微调器背景 我尝试了很多方法来获得完美的图像 但都失败了 s Here is my 9 patch 当我用Draw 9 patch模拟时 内容看起来不错 但是带有箭头的部分没有显示 或者当它显示时 这部
  • 在android中跟踪FTP上传数据?

    我有一个运行 Android 的 FTP 系统 但我希望能够在上传时跟踪字节 这样我就可以在上传过程中更新进度条 安卓可以实现这个功能吗 现在 我正在使用org apache common net ftp我正在使用的代码如下 另外 我在 A
  • JAXB - 列表<可序列化>?

    我使用 xjc 制作了一些课程 public class MyType XmlElementRefs XmlElementRef name MyInnerType type JAXBElement class required false

随机推荐

  • Datalog、CLIPS、Prolog

    和很多程序员一样 我在大学里学过 Prolog 但只学了很少的部分 我理解Prolog和Datalog密切相关 但是Datalog更简单 另外 我相信我读到 Datalog 不依赖于逻辑子句的顺序 但我不确定为什么这是优点 CLIPS 据说
  • 使用 VBA 在 PowerPoint 中设置对象的位置

    我使用以下 VBA 行来设置刚刚粘贴到 PowerPoint 中的 Excel 选区的大小 位置 Set Shp PPApp ActivePresentation Slides PPApp ActiveWindow Selection Sl
  • 返回空列表而不是 null

    我想更改当前函数以返回空 JSON 列表 当前它返回nil 这是我当前的代码 func s Service projectsGet c gin Context var projects models Project user getUser
  • 沿轴对张量进行火炬求和

    如何对张量的列求和 torch Size 10 100 gt torch Size 10 最简单和最好的解决方案是使用torch sum 对张量的所有元素求和 torch sum x gives back a scalar 对所有行 即每列
  • 使用 pyparsing 解析嵌套结构

    我正在尝试解析生物序列中位置的特定语法 职位可以采用以下形式 12 a simple position in the sequence 12 34 a complex position as a base 12 and offset 34
  • 递归 SQL 将 CSV 拆分为表行

    在解决了一个不同的问题后 我偶然发现了递归 CTE 从表面上看 这似乎是解决 将 csv 拆分为表行 问题的相当简单的方法 我把这个例子放在一起 DECLARE InputString varchar 255 a b c d e f g h
  • java.lang.ClassNotFoundException: org.hibernate.annotations.common.reflection.ClassLoadingException

    我使用 spring junit 测试 但在所有测试中都收到此错误消息 因为我更新了 Hibernate Search Hibernate 和 Springframework 在 pom xml 中 我包含了来自 Hibernate 的 c
  • WPF 中某些情况下上下文菜单被剪切

    上下文菜单在不同的 NET Framework 中被截断 查看 ZIP 文件中的图像 有两张截图 一张来自 XP 另一张来自 Win7 我创建了一个简单的 Visual Studio 2010 解决方案来重现我的问题 http www me
  • 在 iOS 13 中连接到 NFCTagReaderSession NFCISO7816Tag 标签并发送命令

    我正在研究 iOS 13 中新提供的 NFCTagReaderSession 我突然连接了会话标签并发送 apdu 命令进行通信 当我调用 connect 属性时 在连接时 发出蜂鸣声 它看起来需要 15 秒才能连接 它会显示一条错误消息
  • Python嵌入

    我想要一个嵌入 Python 解释器和一个小脚本的大型二进制文件 我对整个静态链接 配置和制作以及 GCC 等完全陌生 请问 有人可以向我描述构建此类可执行文件的基本步骤吗 我使用的是 MacOS 10 6 我下载了 Python 3 3
  • Tensorflow 重塑张量

    我正在尝试使用tf nn sparse softmax cross entropy with logits我已遵循用户 Olivier Moindrot 此处 1 的回答 但出现尺寸错误 我正在构建一个分割网络 因此输入图像为 200x20
  • BLOB 如何存储在索引视图中?

    问题 假设我在包含以下内容的表上创建索引视图varbinary max 列 二进制内容是否会被物理复制到索引视图的 B 树中 或者原始字段是否会以某种方式 引用 而无需物理复制其内容 换句话说 如果我在包含 BLOB 的表上创建索引视图 是
  • 将日期时间转换为 24 小时格式

    我从服务器得到的时间就像Jul 27 2011 8 35 29 AM 我想将其转换为yyyy MM dd HH mm ss 我还希望转换后的时间采用 24 小时格式 任何人都可以解决这个问题 我想要得到的输出就像2011 07 27 08
  • 在 Mac OS X 上使用 libpng 编译 C 程序

    我有一个用 C 语言编写的使用 libpng 的小实用程序 在linux下 我只需安装libpng dev并执行 gcc myapp c usr lib libpng so o myapp 在 Mac OS X 中 我安装了 Xcode 工
  • Postgres 从左连接更新

    我是 PostgreSQL 的新手 正在尝试转换来自 SQL Server 的查询 我有一个用户表 其中包括 bUsrActive bUsrAdmin 和 sUsrClientCode 列 如果不存在具有相同 sUsrClientCode
  • 有没有快速的库可以在 Flash 中查找人的眼睛和嘴巴? (动作脚本)

    所以我有实时视频流 上面有 1 一 人 它是黑白的 我需要能够捕捉到这个人的眼睛和嘴巴 方向 至少X Y 状态 至少打开或关闭 那么在这种情况下 有没有快速的库可以在 Flash 中找到人的眼睛和嘴巴呢 纯 Actionscript 或 H
  • 使用 T-SQL 在时间序列数据中前向填充空值的有效方法

    我有一个包含时间序列数据的表 其中大部分为空值 我想用最后一个已知值填充所有空值 我有一些解决方案 但它们比同等的解决方案慢得多DataFrame fillna method ffill 在 Pandas 中进行操作 我正在使用的代码 数据
  • 使用适配器模式包装系统对象(文件、服务控制器等)与绕道进行单元测试相比有哪些优点?

    考虑以下停止服务的方法 Public Function StopService ByVal serviceName As String ByVal timeoutMilliseconds As Double As Boolean Try D
  • Openfire服务器,多个连接,route.all-resources不起作用

    We use http bind我们的聊天应用程序使用 BOSH 和 Openfire 3 8 2 作为后端 Strope 库 JS 作为前端 每个用户通过连接获得指定的唯一资源 这意味着用户可以同时登录不同的设备 浏览器 多个连接 例如
  • 为什么service层和dao层总是有单一的实现接口?

    我工作过 见过一些 spring hibernate Web 应用程序项目 它们具有与实际服务和 dao 类一样多的接口 我一直认为这两个是拥有这些单一实现接口的主要原因 Spring 可以将实际实现连接为给定类中的依赖项 松散耦合 pub