深入Spring专题(16)

120 阅读1分钟

这是我参与2022首次更文挑战的第22天,活动详情查看2022首次更文挑战

深入Spring专题(16)

Bean命名

配置三种名称方案

<beans ...>
	<bean id="string1" class="java.lang.String"/>
    <bean id="string2" class="java.lang.String"/>
    <bean  class="java.lang.String"/>
</beans>

Spring使用以上配置来命名,输出怎样的bean命名

public class BeanNameTest{
    public static void main(String... args){
       GenericXmlApplicationContext ctx= new GenericXmlApplicationContext();
        ctx.load("classpath:spring/app-context.xml");
        ctx.refresh();
        Map<String,String> beans=ctx.getBeansOfType(String.class);
        beans.entrySet().stream().forEach(m->System.out.println(b.getKey()));
        ctx.close();
    }
}

ctx.getBeansOfType(String.class)用于获取ApplicationContext中存在的所有String类型的bean及其ID的映射,映射的键使用lambda表达式打印的bean ID,配置的输出结果如下:

string1
string2
java.lang.String#0

Spring提供给未在配置中明确指定的String类型的Bean的Id,如果修改配置添加另一个未命名的String Bean,可使用以下代码:

<beans ...>
	<bean id="string1" class="java.lang.String"/>
    <bean id="string2" class="java.lang.String"/>
    <bean  class="java.lang.String"/>
    <bean  class="java.lang.String"/>
</beans>

输出结果如下:

string1
string2
java.lang.String#0
java.lang.String#1

Spring确保id在整个ApplicationContext中是唯一的,应使用id属性作为bean名称,然后使用名称别名将bean与其他名称相关联。

Bean名称别名

Spring允许一个Bean拥有多个名称,可通过在bean的标记的name属性中指定以空格、逗号或分号分隔的名称列表来实现多个名称。name属性可代替id属性,或者组合使用这两个属性,除了使用name属性,还可使用标记为Spring Bean名称定义别名。

配置一个bean,定义多个名称如下:

<beans ...>
	<bean id="Tony" name="tony,tom tona;tomy" class="java.lang.String" />
    <alias name="tony" alias=“ton”></alias>
</beans>

一个名称使用id属性定义,另外四个名称使用name属性中分隔的bean名称列表定义,最后使用标记定义了一个别名。

验证使用不同的名称从ApplicationContext实例中获取同一个bean,它们是否相同的bean。