一、bean 的特殊命名规则
当类名首字母和第二个字母都是大写的情况, bean 的命名规则为 "原类名"
查看源码
org/springframework/context/annotation/AnnotationBeanNameGenerator.java
的方法
protected String buildDefaultBeanName(BeanDefinition definition) {
String beanClassName = definition.getBeanClassName();
Assert.state(beanClassName != null, "No bean class name set");
String shortClassName = ClassUtils.getShortName(beanClassName);
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);
}
注意这里
Character.isUpperCase(name.charAt(1)) && Character.isUpperCase(name.charAt(0))
所以,在程序中的
@Controller
public class UController {
public void doUController() {
System.out.println("do U Controller");
}
}
id为原类名,并非是uController
二、Bean注解使用方式
@Controller
public class UserBean {
@Bean
public User user1() {
// 构造测试数据
User user = new User();
user.setId(1);
user.setName("张三");
user.setId(19);
return user;
}
}
Bean注解是在被Controller注解标记的类中的,这样容器中也会有id为user1的bean
之前还一直以为只能在被Configuration注解标记的类中
原因: