Spring Autowired注入邏輯
在Spring中使用Autowired注解坏晦,當(dāng)有多個(gè)bean的類型符合的時(shí)候孤页,Spring是如何選擇的爱榔?
接下來(lái)我們來(lái)看看Spring在使用Autowired注解時(shí)是如何選擇bean的
找到所有類型符合的bean
如果只有一個(gè)翁狐,則使用這個(gè)bean用作依賴注入
-
如果有多個(gè)bean
(1). 選擇其中帶有Primary注解的bean办铡,如果只有一個(gè)就直接返回双抽,如果有多個(gè)bean帶有Primary注解則報(bào)錯(cuò)百框,如果不存在就下一步
(2). 選擇其中優(yōu)先級(jí)最高的bean(優(yōu)先級(jí)使用javax.annotation.Priority表明),如果只有一個(gè)就直接返回牍汹,如果有多個(gè)bean的優(yōu)先級(jí)并列最高則報(bào)錯(cuò)铐维,如果不存在就下一步
(3). 選擇要注入beanName和當(dāng)前要注入的屬性名相同的bean進(jìn)行注入,如果不存在就下一步
(4). 返回null
邏輯主要在DefaultListableBeanFactory.determineAutowiredCandidate中慎菲,具體代碼如下
protected String determineAutowiredCandidate(Map<String, Object> candidateBeans,DependencyDescriptordescriptor) {
Class<?> requiredType = descriptor.getDependencyType();
String primaryCandidate = determinePrimaryCandidate(candidateBeans, requiredType);
if (primaryCandidate != null) {
return primaryCandidate;
}
String priorityCandidate = determineHighestPriorityCandidate(candidateBeans, requiredType);
if (priorityCandidate != null) {
return priorityCandidate;
}
// Fallback
for (Map.Entry<String, Object> entry : candidateBeans.entrySet()) {
String candidateBeanName = entry.getKey();
Object beanInstance = entry.getValue();
if ((beanInstance != null && this.resolvableDependencies.containsValue(beanInstance)) ||
matchesBeanName(candidateBeanName, descriptor.getDependencyName())) {
return candidateBeanName;
}
}
return null;
}