对于这个问题其实我一直很难想明白,了解过springboot的大部分人应该都试过只是单纯的使用controller层、service层就可以实现后端对数据库的CRUD,但是为什么很多人都会再划分一个dao层出来呢,service层又为什么会分出一个impl包呢,我看完这两篇以后确实是理解了一些,现在我想把这个记录下来供我以后回来看一下:
Service 层的接口是不是多此一举? - 知乎 (zhihu.com)
DAO层和Service层的究极理解--这波我在大气层-优快云博客
接下来我得说说我的理解:
首先,我对dao层存在的意义理解其实就是为了不去影响service层的具体实现,毕竟很多的service层中一个方法可能会包含很多对数据库的操作,如果不使用dao层分开的话,那一个方法中岂不是有几百行代码?不过我们又知道为了使sql语句更好的维护和阅读,我们往往会选择一个方法尽量使用一个sql语句逻辑,这就导致了dao层的诞生了(猜测),这样一来service层的方法就只需要调用很多的dao层方法,从而将sql语句分离出来(解耦),出错的时候你也知道只需要修改那个sql语句就行,而且你可以直接去dao层修改,维护一下就变得简单多了;其次,我一个查询语句也可以多次使用啊,每次用我难道复制粘贴吗,或者说我去调用那个拥有这条sql语句的方法吗?如果没有dao层的话,那service方法还包含其他的sql语句也不好直接就调用这个方法的,所以我想dao层的出现对于代码复用也起到一定的作用。
第二,我对service层的理解,我经常看到的service层方法中总要包含一个包,叫做impl包,为什么会有这个玩意,我刚开始每次都会觉得要这个impl包的话我要接口有个毛用,每次在controller层调用service接口,在impl包的类写一个@Service注解,我寻思直接不要接口了嘛,直接调不快的多,麻烦,而且你每次在controller查询的时候我都是调的接口,所以ctr+左键都是找的service接口,然后又要去impl包找具体实现维护,要是不写接口的话我还可以直接转到具体实现那,直接嘎嘎维护,这不更快吗?现在我个人感觉,在我看完上面那篇文章以后,我突然觉得,假如你有两套方案,比如我第一套方案是做超市管理系统(一),第二套是做超市管理系统(二),但是方案一是用来做活动打折的impl1,方案二是正常不打折的impl2,这样我每次活动的时候,我注释掉impl2的@Service,没有活动的时候我注释掉impl1的@Service启用impl2,然后其他的地方全部都不需要修改,另外就是我需要多实现的话,可以按照文档直接先写好接口,然后再具体实现,这样不会把哪个方法给丢了,好像这样理解的话没有问题,暂时我也没有更好的理解了。