Spring中@Autowire注入的深入講解
一直在思考spring的@Autowire注入屬性時(shí)到底是按類型注入還是按名稱注入,今天寫了一個(gè)測(cè)試來證明一下。
定義接口TestService
public interface TestService {
void test();
}
定義接口實(shí)現(xiàn):TestServiceImpl1和TestServiceImpl2
@Service
public class TestServiceImpl1 implements TestService {
public void test() {
System.out.println(1111);
}
}
@Service
public class TestServiceImpl2 implements TestService {
public void test() {
System.out.println(2222);
}
}
定義一個(gè)bean依賴TestService,
@Controller
public class TestController {
//此時(shí)的beanBame=testService
@Autowired
TestService testService;
public void test(){
testService.test();
}
}
編寫測(cè)試類:
@Configuration
@ComponentScan("test")
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext();
context.register(Test.class);
context.refresh();
TestService bean = context.getBean(TestService.class);
bean.test();
}
}
啟動(dòng)項(xiàng)目跟蹤源碼:在spring工廠初始化Bean填充屬性的時(shí)候,AbstractAutowireCapableBeanFactory.populateBean()方法中會(huì)執(zhí)行后置處理器AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues() ,繼續(xù)跟蹤,在DefaultListableBeanFactory.doResolveDependency()方法中的findAutowireCandidates()根據(jù)類型匹配到兩個(gè)Bean,見截圖:

由于獲取的Bean超過兩個(gè),spring會(huì)根據(jù)名稱去匹配,如果匹配成功則返回對(duì)應(yīng)的bean;如果匹配失敗,則會(huì)拋出異常。如圖:

到此為止,我們已經(jīng)能發(fā)現(xiàn)@Autowire注解注入屬性的原理:先根據(jù)類型注入,如果獲取到多個(gè)Bean,則根據(jù)名稱匹配,若名稱未匹配上就拋出異常。
總結(jié)
到此這篇關(guān)于Spring中@Autowire注入的文章就介紹到這了,更多相關(guān)Spring中@Autowire注入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳談鎖和監(jiān)視器之間的區(qū)別_Java并發(fā)
下面小編就為大家?guī)硪黄斦勬i和監(jiān)視器之間的區(qū)別_Java并發(fā)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06
Java驗(yàn)證時(shí)間格式是否正確方法類項(xiàng)目實(shí)戰(zhàn)
在很多場(chǎng)景中我們需要驗(yàn)證時(shí)間日期的是否屬于正確的格式,驗(yàn)證時(shí)間是否符合常規(guī)的,本文就來介紹一下幾種方式,感興趣的可以了解一下2022-04-04
深入理解Java中的并發(fā)工具類CountDownLatch
CountDownLatch?作為?Java?中的一個(gè)同步工具類,用于在多線程間實(shí)現(xiàn)協(xié)調(diào)和控制,本文主要來和大家講解一下JUC?工具類?CountDownLatch的使用,需要的可以參考一下2023-07-07
Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之二手書商城系統(tǒng)的實(shí)現(xiàn)
這是一個(gè)使用了java+JSP+Springboot+maven+mysql+ThymeLeaf+FTP開發(fā)的二手書商城系統(tǒng),是一個(gè)畢業(yè)設(shè)計(jì)的實(shí)戰(zhàn)練習(xí),具有在線書城該有的所有功能,感興趣的朋友快來看看吧2022-01-01
spring-data-redis自定義實(shí)現(xiàn)看門狗機(jī)制
redission看門狗機(jī)制是解決分布式鎖的續(xù)約問題,本文主要介紹了spring-data-redis自定義實(shí)現(xiàn)看門狗機(jī)制,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03
Java中SPI機(jī)制的實(shí)現(xiàn)詳解
SPI(Service?Provider?Interface),是?JDK?內(nèi)置的一種服務(wù)提供發(fā)現(xiàn)機(jī)制,可以用來啟用框架擴(kuò)展和替換組件,下面我們就來看看Java中SPI機(jī)制的具體實(shí)現(xiàn)2024-01-01
Spring多數(shù)據(jù)源導(dǎo)致配置失效的解決
這篇文章主要介紹了Spring多數(shù)據(jù)源導(dǎo)致配置失效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01

