Service 层和 Dao 层有必要为每个类都加上接口吗?
时间:2021-10-29 13:56:59
[导读]作者:架构思维toutiao.com/i6882356844245975563前几天刷头条又刷到了「Service层和Dao层真的有必要每个类都加上接口吗?」这个问题,之前简单回答了一波,给出的观点是「看情况」!现在结合我参与的项目以及阅读的一些项目源码来看。如果项目中使用了像S...
ica, Arial, sans-serif;text-align: start;white-space: normal;" data-mpa-powered-by="yiban.io">作者:架构思维toutiao.com/i6882356844245975563前几天刷头条又刷到了「Service 层和 Dao 层真的有必要每个类都加上接口吗?」这个问题,之前简单回答了一波,给出的观点是「看情况」!现在结合我参与的项目以及阅读的一些项目源码来看。如果项目中使用了像 Spring 这样的依赖注入框架,那可以不用接口!先来说说为什么使用了依赖注入框架以后,可以不使用接口!
不需要接口的理由
我整理了支持 Service 层和 Dao 层需要加上接口的理由,总结下来就这么三个:- 可以在尚未实现具体 Service 逻辑的情况下编写上层代码,如 Controller 对 Service 的调用
- Spring 默认是基于动态代理实现 AOP 的,动态代理需要接口
- 可以对 Service 进行多实现
- 先在 Controller 层编写逻辑,遇到需要委托 Service 调用的地方,直接先写出调用代码。优先完成 Controller 层的流程
- 然后使用 IDE 的自动补全,对刚才调用下层的代码生成对应的类和方法,在里面添加 TODO
- 等所有的类和方法都补全了,再基于 TODO,按照上面的流程去一个个的完善逻辑。
项目结构与接口实现
一般项目结构都是按层来划分的,如下所示:- Controller
- Service
- Dao
- Controller
- Service
- ---- 接口在一个包中
- impl --- 实现在另一个包里
- Dao
- Controller
- Service
- ---- 接口在一个包中
- impl --- 实现在另一个包里
- impl2 --- 新实现在另一个包里
- Dao
- Controller
- Service
- ---- 接口在一个包中
- impl --- 实现在另一个包里
- Service2
- impl2 --- 新实现在另一个包里
- Dao
- Controller
- Service --- 接口模块
- ServiceImpl
- impl --- 实现在另一个包里
- ServiceImpl2
- impl2 --- 新实现在另一个包里
- Dao
- Controller
- Service --- 接口模块
- ServiceImpl
- impl --- 实现在另一个包
- ServiceImpl2
- impl --- 新实现和老实现在相同的包中
- Dao
- Controller
- Service1 --- 老实现
- Service2 --- 新实现
- Dao





