下面是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。