@Component
public class Cv {
public String fff() {
return "fff";
}
}```
---
```java
@Component
public class VC {
public String dd(){
return "dddd";
}
}```
---
```xml
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
```---
```java
public class TestIoc {
[[[[[@Test](http://my.oschina.net/azibug)](http://my.oschina.net/azibug)](http://my.oschina.net/azibug)](http://my.oschina.net/azibug)](http://my.oschina.net/azibug)
public void testIoc(){
ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:bean.xml");
VC c = (VC)ctx.getBean("vC");
System.out.println(c.dd());
Cv v=(Cv)ctx.getBean("cv");
System.out.println(v.fff());
}
}```
---
使用IOC 获取注入的Bean name 的时候遇到了一个奇怪的问题,以前总以为如果不显示声明Bean name,默认注入的是Bean id 是首字母小写字符串
。发现了不全是这样的,一个Bean 为VC,另一个是Cv,然而使用getBean(String name)方法获取bean 的时候。发现VC 类使用getBean("vC"),无法获取bean,而getBean("cv")的时候可以获取IOC 注入的bean.
debug 的时候发现VC 类注入的是"VC",而不是"vC".
源码在AnnotationBeanNameGenerator
```java
/**
* Derive a default bean name from the given bean definition.
*
The default implementation simply builds a decapitalized version
* of the short class name: e.g. "mypackage.MyJdbcDao" -> "myJdbcDao".
*
Note that inner classes will thus have names of the form
* "outerClassName.InnerClassName", which because of the period in the
* name may be an issue if you are autowiring by name.
* [[[@param](http://my.oschina.net/u/2303379)](http://my.oschina.net/u/2303379)](http://my.oschina.net/u/2303379) definition the bean definition to build a bean name for
* [[[@return](http://my.oschina.net/u/556800)](http://my.oschina.net/u/556800)](http://my.oschina.net/u/556800) the default bean name (never {@code null})
*/
protected String buildDefaultBeanName(BeanDefinition definition) {
String shortClassName = ClassUtils.getShortName(definition.getBeanClassName());
return Introspector.decapitalize(shortClassName);
}
可以看出是首字母小写的注入方式,但是例子中VC 却不适用,究竟VC 是怎么注入进去的呢? 正在开会,待续。。。 got it!
/**
* Utility method to take a string and convert it to normal Java variable
* name capitalization. This normally means converting the first
* character from upper case to lower case, but in the (unusual) special
* case when there is more than one character and both the first and
* second characters are upper case, we leave it alone.
*
* Thus "FooBah" becomes "fooBah" and "X" becomes "x", but "URL" stays
* as "URL".
*
* @param name The string to be decapitalized.
* @return The decapitalized version of the string.
*/
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);
}```
由此可以看出,只要Bean的第一个和第二个字母都是大写的话,则不会按照首字母小写注入。