Spring中使用@Autowired注入屬性的奧秘


寫這個博客的時候,我首先引入一個Java基礎面試題。Autowired注解與Resource注解的區別?

 

假如你回答:

@Autowired是默認根據類型注入,如果需要根據字段名注入,則需要加上@Qualifier(name="xxx");@Resource默認根據字段名注入,如果字段名沒找到bean就根據類型注入。

那么我接着問一個問題:

@Autowired如果不加@Qualifier注解,會根據字段名注入嗎?

example:我有一個MyService接口,兩個它的實現類MyServiceImpl2和MyServiceImpl3,分別指定serviceName為myService2和myService3,然后我在Test類中注入這兩個實例。如下:

@Component
public class Test {
    @Autowired
    private MyService myService2;
    @Autowired
    private MyService myService3;
    
    public void run(){
        // do something
    }
}

大家覺得上面的兩個service能注入成功嗎?項目運行正常嗎?

 

首先我先公布一下答案,這個是肯定能注入成功的。為什么呢?

因為Spring中對@Autowired注入的字段,首先根據類型去容器中找出所有匹配的Bean,如果只有一個就直接注入即可,如果有多個則取出來放到一個Map中(key為beanName,value為具體的bean),然后去查找Map中有@Primary的bean進行返回;如果沒有,再去找Map中優先級最大的Bean進行返回;如果也沒有,則根據字段名去Map中匹配key進行返回。

解析依賴注入的bean方法:

org.springframework.beans.factory.support.DefaultListableBeanFactory#doResolveDependency

從多個bean中確定注入的bean方法:

org.springframework.beans.factory.support.DefaultListableBeanFactory#determineAutowireCandidate

以下為部門核心源碼截圖:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM