ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
每个bean都有一个或多个标识符,这些标识符在容器内必须是唯一的。一个bean一般只有一个标识符,如果需要多个的话,额外的可以认为是别名。 基于xml的配置元数据,使用id,name都可以来标识bean。属性id是一个精确的标识。一般,名称使用字母数字,特殊字符也可以。如果你想要引进bean的别名,可以使用name属性,使用逗号,分号或空格隔离。在spring3.1版本之前,id被定义为xsd:ID类型,限制了可能的字符。从3.1开始,被定义为xsd:string类型。bean的id唯一性由容器保证,不在由xml解析器执行。 bean的id和name不是必需的。如果不显示提供,容器为指定一个唯一的name。然而,如果你想用ref元素或服务定位模式通过name来引用bean,那么必须提供一个name。不提供name的场景适合内部类和自动装配。 >:-: **bean命名规则** > >bean的命名规则使用java实例的属性命名规则。即小写字母开头,驼峰式。例如(不带引号):'accountManager', 'accountService', 'userDao', 'loginController'。 > >按规则命名,会使你的配置可读性更高和便于理解,如果你使用spring aop,bean按规则命名会有很大帮助。 > >通过类路径的组件扫描,spring按照以上规则,对未命名的组件生成名称:本质上就是把简单类名首字母改成小写。然而,特殊场景下当类名有多个字母且强两个都是大写的时候,则保留原名。这和spring在用的规则`java.beans.Introspector.decapitalize`一样 > ## Aliasing a bean outside the bean definition 标识一个bean,可以使用属性id和name,id只能有一个值,name可以有多个值。这些name的值就是bean的别名,别名在某些场景下很有用,如每个模块可以使用特定的name值来标识引用的公共依赖。 然而,在定义bean的时候把所有的别名都指定是不够的。有时候需要在别处为bean定义别名。在大型系统中通常是这样的,配置信息分布在各个子系统中,每个子系统有自己的对象定义。在xml配置元数据中,可以使用`<alias/>`来完成这个操作。 ~~~xml <alias name="fromName" alias="toName"/> ~~~ 在上面这个示例中,容器中name为fromName的bean,在使用别名定义之后,toName也引用了此bean。 例如,子系统A通过name为`subsystemA-dataSource`引用数据源。子系统B通过name为`subsystemB-dataSource`引用同样的数据源。主系统包含这两个子系统,同时通过`myApp-dataSource`引用同样的数据源。总共有3个name引用了同样的数据源对象,要在主系统中添加如下配置 ~~~xml <alias name="subsystemA-dataSource" alias="subsystemB-dataSource"/> <alias name="subsystemA-dataSource" alias="myApp-dataSource" /> ~~~ 现在,每个组件和主应用都能使用一个唯一的name来指定同一个DataSource,并保证和其他定义不冲突(有效的创建命名空间)。 > :-: java-configuration > > 如果使用java语言配置,可以使用@Bean注解提供别名。参考[@bean](https://docs.spring.io/spring/docs/5.0.6.RELEASE/spring-framework-reference/core.html#beans-java-bean-annotation)