记一次spring里bean无法注入的历程
Posted 冰花ぃ雪魄
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记一次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,否则就把第一个字母小写。
嗯,我的这个俩个类名确实是第二个字母是大写。。。。
以上是关于记一次spring里bean无法注入的历程的主要内容,如果未能解决你的问题,请参考以下文章