Bean 声明配置
Spring 利用 Ioc 容器管理 Bean,前提是 Bean 需要在配置文件声明(定义)。
声明一个 Bean 需要的基本元素如下:
元素 | 作用 |
---|---|
class | 全限定类名,即 Bean 的完整包名,是必不可少的元素。 |
id | 标识,在整个 Ioc 容器中必须唯一,用来区分不同的 Bean。若 Bean 未指定 id,则 Ioc 容器会为其自动生成一个标识;只能配置一个。 |
name | 标识符或名称, 作用与别名一致;在整个 Ioc 容器汇总必须唯一,但是可以配置多个。 |
alias | 别名,在整个 Ioc 容器汇总必须唯一,但是可以配置多个。 |
声明一个 Bean 的配置如下:
<!-- 1.只配置必须的全限定类名(class),由Ioc 容器为其生成一个标识 -->
<bean class="com.demo.Animals"/>
<!-- 2.指定 id,该标识在 Ioc 容器中必须唯一 -->
<bean id="animals" class="com.demo.Animals"/>
<!-- 3.指定 name,该标识在 Ioc 容器中必须唯一,同一个 Bean 中 name 可以相同 -->
<!-- 可配置一个或多个,第一个会被当作标识,其余的被当作别名 -->
<bean name="animals,Animals" class="com.demo.Animals"/>
<!-- 4.同时指定 id 和 name -->
<bean id="animals" name="animals" class="com.demo.Animals"/>
<!-- 5.同时指定 id 和 alias -->
<!-- alias 在 Bean 中不能单独存在,必须指定 id 或 name -->
<!-- alias 可配置一个或多个,标识在整个 Ioc 容器唯一,在 Bean 中可以 相同 -->
<!-- alias 元素的 name 表示 Bean 的 id 或 name -->
<bean id="animals" class="com.demo.Animals"/>
<alias name="animals" alias="a"/>
<alias name="animals" alias="b"/>
<!-- 6.同时指定 name 和 alias -->
<bean name="animals" class="com.demo.Animals"/>
<alias name="animals" alias="a"/>
<alias name="animals" alias="a"/>
注意事项:
id 在同一个 Bean 中只能指定一个,name 和 alias 可以指定多个;
同时存在 id 和 name 时,id 作为标识,name 会被当作别名;
存在多个 name 时,第一个 name 会被当作 标识,其余的 name 会被当作别名;
多个 name 或 alias 之间可以用分号(;)、空格、逗号(,)隔开。
Bean 调用方式
在 Spring Ioc 容器声明了 Bean 之后,就表示将 Bean 交给 Spring 去管理,由 Spring 负责 Bean 的整个生命周期,包括 Bean 的创建、销毁等等。
这就是所谓的控制反转(Ioc),将 Bean 的控制权交给 Spring,我们无需常见它,只需调用它即可。
通过 Spring Ioc 容器调用 Bean 的方式有三种:根据类型、根据名称、根据名称+类型。
注意事项:
若 Ioc 容器中存在多个同一类型的 Bean 时,根据类型取得 Bean 时会抛出 NoUniqueBeanDefinitionException 异常
若找不到指定名称或类型的 Bean时,会抛出 NoSuchBeanDefinitionException 异常
// 配置文件路径
String path = "/WebRoot/WEB-INF/spring-bean.xml";
// 取得 Spring 的 Ioc 容器(也称应用上下文)
ApplicationContext context = new FileSystemXmlApplicationContext(path);
// 由 Ioc 容器获取定义的 Bean:
// ①根据 Bean 的类型(容器存在多个相同类型 Bean,抛出异常)
Animals animal = (Animals) context.getBean(Animals.class);
// ②根据 Bean 的名称Animals animal = (Animals) context.getBean("animals");
// ③根据 Bean 的类型和名称
Animals animal = (Animals) context.getBean("Animals",Animals.class);
观察上面的代码,发现