在Spring中每一个注册到容器中的Bean都有自己的名字(至少一个),可能不止一个(别名)。对于未明确指定name的Bean,Spring会自动为其生成一个名字。而对于在xml中配置的Bean和使用诸如Service、Component等注解标识的Bean,Spring为其生成名字的方式并不相同,下面我们一一分析。
核心接口
BeanNameGenerator接口定义如下
BeanNameGenerator是生成beanName的顶级接口,而它有两个实现类,图中左侧的DefaultBeanNameGenerator是给XML配置中Bean使用的,图中右侧的AnnotationBeanNameGenerator则是给通过注解定义的Bean使用的。
XML配置
在此不赘述XML文件中Bean的解析过程,直接来看DefaultBeanNameGenerator,其调用链路为
DefaultBeanNameGenerator#generateBeanName—>BeanDefinitionReaderUtils#generateBeanName
最后这个方法的定义如下
注释都写在了上面,逻辑很简单:类名+“#”+数字
注解配置
继续追踪
Introspector.decapitalize的代码如下
通过上面两段代码可以看出逻辑如下
取短类名,即不包含包路径的类名,例如com.test.Student的短类名为Student,这点跟XML配置中取全类名不一样
如果短类名长度大于1,且第一个和第二个字符为大写,则直接返回短类名,也就是说假设类为com.test.STudent,则beanName为STudent
其他情况下将短类名首字符小写后返回,假设类为com.test.Student,则beanName为student
验证
由于只为了验证beanName,简单起见,Bean类中都为空
People类
TNtt类
TestPepole类
TNTt类
其中TestPepole和TNTt通过XML配置
测试主类
输出结果
总结
在不指定beanName的情况下,Spring会自动为注册的Bean生成一个唯一的beanName
通过注解注册的Bean和XML注册的Bean,Spring为其生成默认beanName的机制不一样
不要盲目觉得通过注解注册的Bean,Spring为其生成beanName就是将短类名的首字母小写,当短类名的首字符和第二个字符均大写时,beanName就是短类名
热爱技术才能学好技术
每天进步一点点
领取专属 10元无门槛券
私享最新 技术干货