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>)
- 如果定义了
注意!!:
<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" +
"-------------"
));
}