spring配置文件中<bean>的id和name属性区别,以及identifier和aliases

Every bean has one or more identifiers. These identifiers must be unique within the container that hosts the bean. A bean usually has only one identifier, but if it requires more than one, the extra ones can be considered aliases.这是spring reference中的解释,标识符和别名本质上其实是相同的,都可以唯一地标识一个bean。


In XML-based configuration metadata, you use the id and/or name attributes to specify the bean identifier(s). The id attribute allows you to specify exactly one id. If you want to introduce other aliases to the bean, you can also specify them in the name attribute, separated by a comma (,), semicolon (;), or white space. 可以看出:id和name的本质区别:id只能定义1个identifier,而name可以定义多个aliases。


1.配置一个bean的时候,我们可以不设置id,也可以不设置name,spring默认会使用类的全限定名作为bean的标识符。

<bean class="net.aty.spring.ioc.first.C1"></bean>
// 没有设置id,也没有设置name, 默认用类的全限定名
boolean same = ctx.getBean(C1.class) == ctx.getBean(C1.class
		.getCanonicalName());
System.out.println(same);//true

2.如果使用id属性来设置bean的标识符,那么id在spring容器中必需唯一。


3.如果使用name属性来设置,那么设置的其实就是bean的标识符,必需在容器中唯一。

<bean name="c1" class="net.aty.spring.ioc.first.C1"></bean>
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
		"first-spring.xml");
System.out.println(ctx.getBean("c1",C1.class));
ctx.close();


4.如果同时设置id和name,那么id设置的是标识符,name设置的是别名。
<bean id="cid" name="alias1" class="net.aty.spring.ioc.first.C1"></bean>
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
		"first-spring.xml");

String[] alias = ctx.getAliases("cid");

for (String e : alias) {
	System.out.println(e);//alias1
}

ctx.close();


如果id和name的值相同,那么spring容器会自动检测并消除冲突:让这个bean只有标识符,而没有别名。
<bean id="cid" name="cid" class="net.aty.spring.ioc.first.C1"></bean>
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
		"first-spring.xml");

String[] alias = ctx.getAliases("cid");

System.out.println(alias.length);//0

ctx.close();

5.name属性设置多个值。不设置id,那么第一个被用作标识符,其他的被视为别名。如果设置了id,那么name的所有值都是别名。
<bean name="a1,a2,a3" class="net.aty.spring.ioc.first.C1"></bean>
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
		"first-spring.xml");

String[] alias = ctx.getAliases("a1");

System.out.println(Arrays.toString(alias));//[a2, a3]

ctx.close();
注意:不管是标识符,还是别名,在容器中必需唯一。因为标识符和别名,都是可以用来获取bean的,如果不唯一,显然不知道获取的到底是哪儿一个bean。

<bean id="c1" name="alias" class="net.aty.spring.ioc.first.C1"></bean>
<bean id="c2" name="alias" class="net.aty.spring.ioc.first.C2"></bean>



6.使用<alias>标签指定别名,别名也必须在IoC容器中唯一。

<bean id="c1" class="net.aty.spring.ioc.first.C1"></bean>
<alias name="c1" alias="1"/>
<alias name="c1" alias="2"/>
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
		"first-spring.xml");

String[] alias = ctx.getAliases("c1");

System.out.println(Arrays.toString(alias));//[1,2]

ctx.close();



最后看一段配置和代码:
<bean id="c1" class="net.aty.spring.ioc.first.C1"></bean>
<alias name="c1" alias="1"/>
<alias name="c1" alias="2"/>
System.out.println(Arrays.toString(ctx.getAliases("c1")));//[1,2]
System.out.println(Arrays.toString(ctx.getAliases("1")));//[c1,2]
System.out.println(Arrays.toString(ctx.getAliases("2")));//[c1,1]

System.out.println(ctx.getBean("c1") == ctx.getBean("1"));//true
System.out.println(ctx.getBean("c1") == ctx.getBean("2"));//true


可以看到:标识符和别名没有任何区别,所以id和name属性唯一的差别在于:id只能设置一个标识符,而name可以设置多个标识符separated by a comma (,), semicolon (;), or white space。


参考文章:

http://jinnianshilongnian.iteye.com/blog/1413857


### PyCharm 打开文件显示不全的解决方案 当遇到PyCharm打开文件显示不全的情况时,可以尝试以下几种方法来解决问题。 #### 方法一:清理缓存并重启IDE 有时IDE内部缓存可能导致文件加载异常。通过清除缓存再启动程序能够有效改善此状况。具体操作路径为`File -> Invalidate Caches / Restart...`,之后按照提示完成相应动作即可[^1]。 #### 方法二:调整编辑器字体设置 如果是因为字体原因造成的内容显示问题,则可以通过修改编辑区内的文字样式来进行修复。进入`Settings/Preferences | Editor | Font`选项卡内更改合适的字号大小以及启用抗锯齿功能等参数配置[^2]。 #### 方法三:检查项目结构配置 对于某些特定场景下的源码视图缺失现象,可能是由于当前工作空间未能正确识别全部模块所引起。此时应该核查Project Structure里的Content Roots设定项是否涵盖了整个工程根目录;必要时可手动添加遗漏部分,并保存变更生效[^3]。 ```python # 示例代码用于展示如何获取当前项目的根路径,在实际应用中可根据需求调用该函数辅助排查问题 import os def get_project_root(): current_file = os.path.abspath(__file__) project_dir = os.path.dirname(current_file) while not os.path.exists(os.path.join(project_dir, '.idea')): parent_dir = os.path.dirname(project_dir) if parent_dir == project_dir: break project_dir = parent_dir return project_dir print(f"Current Project Root Directory is {get_project_root()}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值