寫這個博客的時候,我首先引入一個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
以下為部門核心源碼截圖: