浅析 Spring IoC - XML Bean的配置

下面是Spring IoC的 xml 配置文件:java

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- <import resource="beans2.xml"/> -->

    <bean id="userDAO" class="com.dao.impl.UserDAOImpl" />
    
    <bean id="userService" class="com.service.impl.UserServiceImpl">
        <property name="userDAO" ref="userDAO" />
    </bean>
    
    <alias name="userService" alias="userServiceAlias"/>
</beans>

    在 Spring IoC的 xml 配置文件中,<bean>标签主要用来进行 Bean 定义; 而 <alias> 用于定义 Bean 的别名; <import> 用于导入其余配置文件的 Bean定义,能够放在 <beans>下任何位置,无顺序关系。spring

1. Bean 的命名测试

    每个 Bean 能够有一个或者多个 id(或称之为 标识符 或 名称),第一个 id 称之为”标识符“,其他 id 叫作别名;这些id 在容器中必须惟一。下面有几种方式 为 Bean 指定 id:
spa

    (1)不指定 id,之配置必须的 全限定类名,由 IoC 容器为其生成一个标识,必须经过 getBean (Class<T>)获取 Bean。
code

<bean class="com.service.impl.UserServiceImpl">
    <property name="userDAO" ref="userDAO" />
</bean>

    测试代码:xml

@Test
	public void testAddUser() throws Exception {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
		
		UserServiceImpl service = (UserServiceImpl) ctx.getBean(UserServiceImpl.class);
		
		User user = new User();
		user.setUsername("Olive");
		service.addUser(user);
	}

    (2)指定 id,并且 id 在  IoC 容器中惟一。代码如开头部分,调用以下:get

UserServiceImpl service = (UserServiceImpl) ctx.getBean("userService");

    (3)指定 name,这样name就是标识符,必须在 IoC 容器中惟一,用法同上面的 id
io

    (4)指定 id 和 name, id就是标识符,而 name 就是别名,必须在 IoC容器中惟一。若是 id 和 name 相同, IoC容器能检测到并消除冲突。
class

    (5)指定多个 name, 用 逗号、分号或者 空格符 分隔,第一个被用做标识符,其余的都是别名。
test

<!-- 当指定id时,name 指定的标识符全都为别名 -->
    <bean id="userService" name="userService,userS1,userS2" class="com.service.impl.UserServiceImpl">
        <property name="userDAO" ref="userDAO" />
    </bean>

    (6)使用 <alias> 标签指定别名,别名也必须在 IoC 容器中惟一,代码同文章开始的配置文件。

    从上面来看,name 或者 id 均可以做为标识符,那么为何还要有两个同时存在呢?由于当使用基于 XML 的配置元数据时,在 XML 中 id 是一个真正的XML id属性,所以当其余的定义来引用这个id时就体现出id的好处了,能够利用XML解析器来验证引用的这个id是否存在,从而更早的发现是否引用了一个不存在的bean,而使用name,则可能要在真正使用bean时才能发现引用一个不存在的bean。

相关文章
相关标签/搜索