應用啟動的時候失敗,看了下異常,是這個---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,否則就把第一個字母小寫。
嗯,我的這個倆個類名確實是第二個字母是大寫。。。。