springboot中service层注入的是实现类,但Controller层接收的是接口
我們習慣這樣編寫代碼:
在service層寫接口,然后用實現類去實現接口,并且將實現類注入到容器中
@Service public class AccountServiceImpl implements AccountService {}在controller層卻是用接口操作service的bean的方法,
@Autowired private AccountService userService;為神魔這樣?
理解:
1)注入的就是實現類,只不過拿接口來接收,接受的類型為接口,面向接口編程,那么為何要面向接口編程?這就涉及到使用接口做代理,因為通過@autowired的對象是通過接口的方式會使用jdk動態代理,jdk動態代理只能對實現接口的類生成代理,而不能針對類。
2)注入的是實現類對象,接收的是接口;理解為多態;
如果一個service接口有多個實現類呢?
controller類中使用@resource并通過byname的方式注入,不要用@autowired這種通過類型的方式了,
Service層(此時有兩個接口實現類)
@Service("PCIImpt1")class PCIImpt1 imeplements PCI{}@Service("PCIimpt2")class PCIImpt2 imeplements PCI{}Controller層
@Resource(name="PCIimpt2") //填PCIimpt1,注入PCIimpt1實現類,填PCIimpt2,則注入PCIimpt2實現類 private PCI pci; //注入接口以Resource手動指定接收@Service注解是放實現類上的而非接口上
今天用springboot寫多模塊項目,寫完第一個Controller類,注入的Service接口是ok的,然后寫第二個Controller類就一直報錯。這把我給搞懵逼了,為什么我第一個Controller沒錯,第二個錯了,我代碼都一樣的啊。
我看他說沒掃描到,就去看了下@Service注解,有啊。然后我再去看包名,也對的啊。多模塊下面每個模塊的包名都一樣的,能夠被@SpringBootApplication掃描到啊,徹底蒙圈了。
看來看去我都沒找到哪里錯了,好吧,1個半小時過去了,我自己找不到,去百度去問人。這是越來越蒙圈(百度要不是說包名要一樣,要不就是說@SpirngBootApplication掃描同級及下層所有子包,我都知道啊,概念清楚,也沒錯,包名我又再對了一遍。然后再就是手動掃描,自己額外寫注解,無論是@ComponentScan和@SpirngBootApplication(“xx”)我都試了,中間倒是掌握了個小知識——手動用注解掃描的話,記得還要手動把@SpringBootApplication注解所在的類的所在包一起掃進去)。
3個小時了,我徹底放棄了。準備重來一次,重新上git拉了個模板,把自己的代碼文件一個一個拉過去,(以前出現過一次兩個項目代碼完全一樣的,就是一個對了,一個出問題,現在懷疑是當時導入的maven依賴有沖突,一個運氣好莫名其妙對了,一個運氣差)拉著拉著我就 發現剛才好像有個文件沒有@Service啊,額。再一看,好吧,還真沒有,把@Service寫到接口上去了,Impl實現類上沒有@Service,額。無語,只能恨自己眼瞎,看包名看了一遍又一遍就是沒看@Serivce到底放在什么位置。
總結一下:老老實實跟著IDEA的報錯去找,這要是老老實實從service類開始開,細心一點,三個小時就不會浪費了。(也是自己技能沒掌握扎實,我估計是當時犯渾,沒搞清@Service放接口和放實現類上的差距)
過了1個多星期了,這幾天復習了spring,spring可以管理部分工具類,但是不可以管理接口,也就是@Controller,@Component,@Repository,@Service不能放接口上。
總結
以上是生活随笔為你收集整理的springboot中service层注入的是实现类,但Controller层接收的是接口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习Spring Boot:(八)Myb
- 下一篇: JVM面试题与答案