首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Spring中的默认beanName

在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就是短类名

热爱技术才能学好技术

每天进步一点点

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230105A08WWU00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券