在 Spring中,id和name命名Bean有什么区别?
嗨,你好呀,我是猿java
首先,让我们来看下Spring XML配置方式,id和name是如何定义Bean的:
1 | <!-- 用id定义 --> |
接着,我们看一个注解方式:
1 | // 注解方式 |
那么,问题来了:注解中的@Service("userService")
相当于 XML中的 id还是 name?
这篇文章,我们来聊一聊。
1. 历史背景
在早期的Spring版本(1.x时代):
id
属性:必须符合 XML ID规范(不能有特殊字符,不能以数字开头等)name
属性:更灵活,可以用各种字符,还能定义多个别名
这就导致很多开发者因为 XML规范限制不得不使用name
。
但是!在Spring 3.1之后,id
属性不再受XML ID规范约束了,现在它和name
在灵活性上已经平起平坐了。
2. 原理剖析
本质相同:无论是id还是name,最终都会变成 Bean的标识符(identifier)。
特殊之处:
id
:一个 Bean只能有一个idname
:可以定义多个,用逗号/分号/空格分隔,相当于给Bean起别名,
1 | <bean name="userService,userManager,userApi" class="com.example.UserService"/> |
- 查找顺序:当使用
getBean()
时,Spring会先查id,再查 name
3. 如何获取 bean?
场景1:简单Bean定义
1 | // 注解方式 |
对于@Service("xxx")
中的名称既会作为id,也会作为 name注册!这个也回到了我们文章开头的问题。
场景2:需要别名的情况
1 | <bean id="mainDataSource" name="primaryDB,defaultDB" class="com.example.DataSource"/> |
这时候用 name定义别名就很方便,代码中可以根据不同场景使用不同名称获取同一个Bean。
场景3:带有特殊字符的Bean名
1 | <bean name="/api/user" class="com.yuanjava.UserController"/> |
虽然现在 id也支持特殊字符了,但看到name="/api/user"
这样的写法,是不是更符合咱们的直觉?
4. id和name有区别吗?
通过上面的分析,你觉得id
和name
命名Bean在性能上会有差异吗?
答案是:几乎没有区别!因为Spring内部会把它们统一处理成标识符,选择id
或name
不会影响应用性能。
经过这么多年的踩坑,我的建议是:
- 默认使用id:因为它更语义化,表示唯一标识
- 需要别名时加上name:两者可以共存!
1
<bean id="userService" name="userManager,userApi" class="com.example.UserService"/>
- 团队统一规范:比选择哪个更重要!
5. 总结
本文,我们分析了id和name命名的历史,区别,以及如何在应用中使用它们:
- 如果你的Bean需要一个明确的、唯一的标识,请用id命名Bean
- 如果需要灵活性、多个名称,请用name命名Bean
- 其实在Spring的现代版本中,它们的差别已经很小了,最关键是保持一致性
好的命名是成功的一半,在 Spring世界里,id
和name
就像你的左右手,关键是要知道什么时候用哪只!
6. 交流学习
最后,把猿哥的座右铭送给你:投资自己才是最大的财富。 如果你觉得文章有帮助,请帮忙转发给更多的好友,或关注公众号:猿java,持续输出硬核文章。
