相信大家在学习spring中,经常用:@Component,@Controller,@Service,@Repository这些注解来替代在spring配置文件中来配置bean。
在使用这些注解的时候,我们可以通过这些注解的value属性来设置bean的名称:
package com.zphsite.pojo;
import lombok.Data;
import org.springframework.stereotype.Component;
/**
* @author zph
* @date : 2022/11/20 21:18
*/
@Data
@Component("userBean") //不指定bean的名字默认是"user"
public class User {
private String name;
private int age;
private String sex;
}
然后我们通过一下代码可以从sprin容器中根据这个"userBean"名字调用getBean("userBean")从容器中获取bean。
package com.zphsite.spring;
import com.zphsite.pojo.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author zph
* @date : 2022/11/20 21:20
*/
public class TestBean {
@Test
public void test(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
User userBean = applicationContext.getBean("userBean", User.class);
System.out.println(userBean);
}
}
但是如果我们使用注解的时候不给value赋值呢,那么这个beand名字又是什么呢,这个时候浅学过spring的同学会回答说:这个bean会有默认的名字就是,这个类名首字母小写就可以了
没错,这个同学回答对了一半,当我们的名字如果正常的驼峰命名的话确实就是首字母小写
但是我的类名是一下这个奇怪的名字呢?
package com.zphsite.pojo;
import org.springframework.stereotype.Component;
/**
* @author zph
* @date : 2022/11/20 22:06
*/
@Component
public class QIUGuanZhu {
private String QIUQIULA;
}
OH NO!我不是首字母小写了吗,怎么回事呀!!!
好了,搞笑到此为止,就让我们去看看这个神圣的源码吧^_^
这是beanName生成的接口,有以下实现类 ()
我们重点关注AnnotationBeanNameGenerator这个实现类,他是为注解bean来生成名字的
在AnnotationBeanNameGenerator实现类中有一个方法buildDefaultBeanName就是用来生成默认名字的
而这方法里面最关键的就是最后一行代码(本文最关键的代码来了,其实看这里就可以了^_^)
通过这个源码我们可以得出结论,如果你的类名的第一个和第二个字母是大写的话就直接返回类名作为默认bean的名称(这也就是前面QIUGuanZhu这个bean报错的原因),如果是正常的驼峰命名就是首字母小写即可。
请观众老爷们点点关注^_^