Spring 支持相当浮渣的 bean 命名结构,从而允许灵活地处理多种情况。
<mark>每个 bean 在其所在的 ApplicationContext 中至少包含一个唯一的名称。</mark>

命名 - 优先级

Spring 遵循一个简单的解析过程来确定 bean使用的是什么名称

  • 如果有指定id属性
    id属性的值将作为名称。
  • 如果没有指定id属性
    ⇒ Spring会查找 name 属性
    • 如果定义了name属性
      ⇒ 那么将使用 name 属性中定义的第一个名称
      (<mark>一个bean 可以有多个 name 属性</mark>)。
    • 如果既没有指定 id属性, 也没有指定 name 属性
      ⇒ 那么 Spring 使用该 bean 的类名作为名称
      (如:<mark>SuperMan类 ⇒ 名称 superMan</mark>)

<mstyle mathcolor="&#35;f01"> </mstyle> \color{#f01}{注意!!}
<mark>如果声明有其他 bean 使用相同的类名,或者声明多个没有 ID 也没有 name 属性的相同类</mark>
⇒ 那么,Spring 将在 ApplicationContext 初始化起见,在注入时抛出异常
(类型为 org.springframework.beans.factory.NoSuchBeanDefinitionException

下面展示几种情况:

1. 三种命名方案 - 展示

<bean id="string1" name="f**k! you,mother;every" class="java.lang.String">
</bean>
<alias name="string1" alias="day"/>
<bean name="string2" class="java.lang.String"/>
<bean class="java.lang.String"/>
private static  GenericXmlApplicationContext gtx = null ; 
static {
	gtx = new GenericXmlApplicationContext() ; 
	gtx.load("classpath:book/name/name_getBeansOfType.xml");
	gtx.refresh();
}
@Test
public void testName() {
	Map<String, String> map = gtx.getBeansOfType(String.class);
	map.entrySet().forEach(e -> System.out.println(
			e.getKey() + ":" + e.getValue()));
}

2. 别名标签 <alias> - 展示

  • <alias> / 空格 / “,” / “;” ⇒ 可以生成别名
  • getAliases ⇒ 得到所有别名
<bean id="string1" name="f**k! you,mother;every" class="java.lang.String">
</bean>
<alias name="string1" alias="day"/>
<bean name="string2" class="java.lang.String"/>
<bean class="java.lang.String"/>
	@Test
	public void testAliasName() {
		String[] aliases = gtx.getAliases("string1");
		System.out.println(Arrays.toString(aliases));
	}

3. id与name冲突情况 - 展示

首先: id无法分割时,不允许与 name 冲突

再来:

  • 当 id 可以分割,与 name 冲突 ⇒ 对id进行分割
  • 当 id 可以分割,没有雨 name 冲突 ⇒ 不对 id 进行分割
<bean id="a A,aa;AA bb" name="QQ" class="book.chapter3.name.A"></bean>
<bean name="a A,aa;AA bb" class="book.chapter3.name.A"></bean>
<bean id="a A,aa;AA" class="book.chapter3.name.A"/>
	@Test
	public void testNameCrashID() {
		Map<String, A> beans = gtx.getBeansOfType(A.class);
		beans.entrySet().forEach(e -> System.out.println(
			"id="+e.getKey()+"\n"+
			"aliases="+ Arrays.toString(gtx.getAliases(e.getKey()))+ "\n" +
			"-------------"
			));
		
	}