日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

springboot中service层注入的是实现类,但Controller层接收的是接口

發(fā)布時(shí)間:2025/3/12 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 springboot中service层注入的是实现类,但Controller层接收的是接口 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我們習(xí)慣這樣編寫代碼:

在service層寫接口,然后用實(shí)現(xiàn)類去實(shí)現(xiàn)接口,并且將實(shí)現(xiàn)類注入到容器中

@Service public class AccountServiceImpl implements AccountService {}

在controller層卻是用接口操作service的bean的方法,

@Autowired private AccountService userService;

為神魔這樣?

理解:

1)注入的就是實(shí)現(xiàn)類,只不過(guò)拿接口來(lái)接收,接受的類型為接口,面向接口編程,那么為何要面向接口編程?這就涉及到使用接口做代理,因?yàn)橥ㄟ^(guò)@autowired的對(duì)象是通過(guò)接口的方式會(huì)使用jdk動(dòng)態(tài)代理,jdk動(dòng)態(tài)代理只能對(duì)實(shí)現(xiàn)接口的類生成代理,而不能針對(duì)類。

2)注入的是實(shí)現(xiàn)類對(duì)象,接收的是接口;理解為多態(tài);

如果一個(gè)service接口有多個(gè)實(shí)現(xiàn)類呢?

controller類中使用@resource并通過(guò)byname的方式注入,不要用@autowired這種通過(guò)類型的方式了,

Service層(此時(shí)有兩個(gè)接口實(shí)現(xiàn)類)

@Service("PCIImpt1")class PCIImpt1 imeplements PCI{}@Service("PCIimpt2")class PCIImpt2 imeplements PCI{}

Controller層

@Resource(name="PCIimpt2") //填PCIimpt1,注入PCIimpt1實(shí)現(xiàn)類,填PCIimpt2,則注入PCIimpt2實(shí)現(xiàn)類 private PCI pci; //注入接口以Resource手動(dòng)指定接收

@Service注解是放實(shí)現(xiàn)類上的而非接口上

今天用springboot寫多模塊項(xiàng)目,寫完第一個(gè)Controller類,注入的Service接口是ok的,然后寫第二個(gè)Controller類就一直報(bào)錯(cuò)。這把我給搞懵逼了,為什么我第一個(gè)Controller沒(méi)錯(cuò),第二個(gè)錯(cuò)了,我代碼都一樣的啊。

我看他說(shuō)沒(méi)掃描到,就去看了下@Service注解,有啊。然后我再去看包名,也對(duì)的啊。多模塊下面每個(gè)模塊的包名都一樣的,能夠被@SpringBootApplication掃描到啊,徹底蒙圈了。

看來(lái)看去我都沒(méi)找到哪里錯(cuò)了,好吧,1個(gè)半小時(shí)過(guò)去了,我自己找不到,去百度去問(wèn)人。這是越來(lái)越蒙圈(百度要不是說(shuō)包名要一樣,要不就是說(shuō)@SpirngBootApplication掃描同級(jí)及下層所有子包,我都知道啊,概念清楚,也沒(méi)錯(cuò),包名我又再對(duì)了一遍。然后再就是手動(dòng)掃描,自己額外寫注解,無(wú)論是@ComponentScan和@SpirngBootApplication(“xx”)我都試了,中間倒是掌握了個(gè)小知識(shí)——手動(dòng)用注解掃描的話,記得還要手動(dòng)把@SpringBootApplication注解所在的類的所在包一起掃進(jìn)去)。

3個(gè)小時(shí)了,我徹底放棄了。準(zhǔn)備重來(lái)一次,重新上git拉了個(gè)模板,把自己的代碼文件一個(gè)一個(gè)拉過(guò)去,(以前出現(xiàn)過(guò)一次兩個(gè)項(xiàng)目代碼完全一樣的,就是一個(gè)對(duì)了,一個(gè)出問(wèn)題,現(xiàn)在懷疑是當(dāng)時(shí)導(dǎo)入的maven依賴有沖突,一個(gè)運(yùn)氣好莫名其妙對(duì)了,一個(gè)運(yùn)氣差)拉著拉著我就 發(fā)現(xiàn)剛才好像有個(gè)文件沒(méi)有@Service啊,額。再一看,好吧,還真沒(méi)有,把@Service寫到接口上去了,Impl實(shí)現(xiàn)類上沒(méi)有@Service,額。無(wú)語(yǔ),只能恨自己眼瞎,看包名看了一遍又一遍就是沒(méi)看@Serivce到底放在什么位置。

總結(jié)一下:老老實(shí)實(shí)跟著IDEA的報(bào)錯(cuò)去找,這要是老老實(shí)實(shí)從service類開始開,細(xì)心一點(diǎn),三個(gè)小時(shí)就不會(huì)浪費(fèi)了。(也是自己技能沒(méi)掌握扎實(shí),我估計(jì)是當(dāng)時(shí)犯渾,沒(méi)搞清@Service放接口和放實(shí)現(xiàn)類上的差距)

過(guò)了1個(gè)多星期了,這幾天復(fù)習(xí)了spring,spring可以管理部分工具類,但是不可以管理接口,也就是@Controller,@Component,@Repository,@Service不能放接口上。

總結(jié)

以上是生活随笔為你收集整理的springboot中service层注入的是实现类,但Controller层接收的是接口的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。