<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Spring的@Autowired加到介面上但獲取的是實現類?
/* 類 @Controller註解,會在spring容器中範例化物件 */ @Controller public class UserContoller{ @Autowired // 先按型別找,然後按id為屬性名去找 private UserService userService; //為什麼他會拿到userServiceImpl? // @Autowired會幫你按UserService的型別去容器中找唯一bean物件 // 1、容器沒有該型別的物件:報錯 // 2、容器中有該型別的唯一bean物件,就將該唯一bean物件賦值給該屬性 ///3、容器中有多個【兩個及以上】該型別的唯一bean物件, // 它會再根據該屬性名去容器中找, // 看看容器中的哪個bean物件的id值和該屬性名一致, // 如果有,就將容器中該物件賦值給該屬性,如果沒有報錯。 } /* 介面 */ public interface UserService{} /* 類 @Service註解,會在spring容器中範例化物件 */ @Service public class UserServiceImpl implements UserService{}
@Autowired先按型別找,然後再按id為屬性名去找
他會幫你按UserService的型別去容器中找唯一bean物件
它會再根據該屬性名去容器中找,看看容器中的哪個bean物件的id值和該屬性名一致,如果有,就將容器中該物件賦值給該屬性,如果沒有報錯。
然後通過多型的向上轉型就賦值成功。等價於之前手動賦值
UserService userService = new UserServiceImpl();
@Autowired是spring的註解,預設使用的是byType的方式向Bean裡面注入相應的Bean。
@Autowired private UserService userService;
這段程式碼會在初始化的時候,在spring容器中尋找一個型別為UserService的bean實體注入,關聯到userService的引入上。
但是如果UserService這個介面存在多個實現類的時候,就會在spring注入的時候報錯,具體如下:
public class UserService1 implements UserService public class UserService2 implements UserService
當存多個UserService的實現類時,錯誤資訊如下:
2016-08-05 14:53:53,795 ERROR [org.springframework.test.context.TestContextManager] - <Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@14a2f921] to prepare test instance [UserServiceTest@3c87521]>
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'UserServiceTest': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private yjc.demo.service.UserService UserServiceTest.userService; nested exception is he[yjc.demo.service.UserService] is defined: expected single matching bean but found 2: userService1,userService2
丟擲了org.springframework.beans.factory.BeanCreationException,而原因是注入的時候發現有2個匹配的bean,但是不知道要注入哪一個:expected single matching bean but found 2: userService1,userService2
那麼如何應對多個實現類的場景呢,看一下程式碼:
@Autowired private UserService userService1; @Autowired private UserService userService2; @Autowired @Qualifier(value = "userService2") private UserService userService3; @Test public void test(){ System.out.println(userService1.getClass().toString()); System.out.println(userService2.getClass().toString()); System.out.println(userService3.getClass().toString()); }
執行結果:
class yjc.demo.serviceImpl.UserService1
class yjc.demo.serviceImpl.UserService2
class yjc.demo.serviceImpl.UserService2
執行結果成功,說明了2種處理多個實現類的方法:
1.變數名用userService1,userService2,而不是userService。
通常情況下@Autowired是通過byType的方法注入的,可是在多個實現類的時候,byType的方式不再是唯一,而需要通過byName的方式來注入,而這個name預設就是根據變數名來的。
2.通過@Qualifier註解來指明使用哪一個實現類,實際上也是通過byName的方式實現。
由此看來,@Autowired註解到底使用byType還是byName,其實是存在一定策略的,也就是有優先順序。優先用byType,而後是byName。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45