記一次spring里bean無法注入的歷程


應用啟動的時候失敗,看了下異常,是這個---NoUniqueBeanDefinitionException。 大家都知道,這是因為有倆個類型相同的實例,在被注入的時候,spring不知道該用哪個。

但是,我們都知道,一個向spring注冊的bean,他的名字默認是這個類的shortclassname,然后對第一個字母小寫。在使用的時候,使用@Resource注解,會先用這個字段的命名作為bean的name去spring里找。看了下,代碼里完全遵守了這個規則,但是還是報錯,所以到spring內部一看究竟。

首先通過代碼和異常信息結合起來看,發現我注冊的倆個bean的name完全是他們的類的shortclassname,沒有把第一個字母小寫。這是為什么嘞?然后看下注冊bean的過程,看下這個name生成的規則是什么。然后發現了下面這段代碼:

protected String buildDefaultBeanName(BeanDefinition definition) {
String shortClassName = ClassUtils.getShortName(definition.getBeanClassName());
return Introspector.decapitalize(shortClassName);
}

public static String decapitalize(String name) {
if (name == null || name.length() == 0) {
return name;
}
if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) &&
Character.isUpperCase(name.charAt(0))){
return name;
}
char chars[] = name.toCharArray();
chars[0] = Character.toLowerCase(chars[0]);
return new String(chars);
}

這里有一個邏輯是說,如果第一個字母和第二個字母都是大寫的話,就直接使用類的shortname作為這個bean的name,否則就把第一個字母小寫。

嗯,我的這個倆個類名確實是第二個字母是大寫。。。。


免責聲明!

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



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