Spring 系列 - XML 配置管理对象
Publish date: Oct 129, 12119
Last updated: Oct 219, 21029
Last updated: Oct 219, 21029
问
介绍下 Spring IoC 容器是如何使用 XML 文件格式管理对象的?
答
职责
因:
对象在 IoC 容器中会被映射成相应的 Bean
对象需要进行依赖注入
Spring IoC 使用 XML 这种语义最清晰的格式完成这两件事。
横向关系
对象注册
beans
顶层元素
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> </beans>
角色:所有 bean 的统帅,拥有的属性可以对所辖的 bean 进行统一配置
属性:
- default-lazy-init:默认为 false,标志是否对所有的 bean 延迟初始化
- default-autowire:默认为 no,表明是否使用自动绑定
- default-dependency-check:默认为 none,表示不做依赖检查
- default-init-method:统一指定初始化方法名
- default-destroy-method:统一指定对象销毁方法名
- …
description | import | alias
- 非必须元素
- 含义分别是:
- description:指定一些描述性的信息
- import:引用其他的配置文件
- alias:可以为 bean 起别名
bean
核心元素,每个业务对象都对应一个 bean,如下:
属性:
- id:唯一标志,指定当前注册对象的 beanName,与其他 bean 区分
- name:指定 bean 的别名,多个 name 可以指定同一个 bean
class:bean 元素的 class 类型,大部分情况下,该属性必须得有
<bean id="djNewsListener" name="/news/djNewsListener,dowJonesNewsListener" class="..impl.DowJonesNewsListener"> </bean>
依赖注入
构造方法注入
constructor-arg
构造方法注入标记
属性:
- type:明确构造方法中的参数类型,确保调用的是恰当的构造方法
index:明确参数在构造方法中的位置,以免多个参数类型相同时混淆
<bean id="mockBO" class="..MockBusiness"> <constructor-arg type="int"> <value>1111</value> </constructor-arg> </bean> <bean id="mockBO" class="..MockBusiness"> <constructor-arg index="1" value="1111"/> <constructor-arg index="0" value="2222"/> </bean>
setter方法注入
property
- setter 方法注入标记
属性:
name:指定注入对象所对应的实例变量名称
<bean id="djNewsProvider" class="..FXNewsProvider"> <property name="newsListener"> <ref bean="djNewsListener"/> </property> <property name="newsPersister"> <ref bean="djNewsPersister"/> </property> </bean>
注入参数类型
<value>
基本数据类型、String 和基本数据类型的包装类<ref>
引用容器中其他的对象实例,通过 local、parent 和 bean 属性指定<idref>
指定所依赖对象的名称,可以在解析时做检查内部<bean>
内部类,其他对象无法引用它<list>
注入对象类型为 java.util.List 及其子类或数组类型的依赖对象<set>
注入对象类型为 java.util.Set 及其子类类型的依赖对象<map>
注入对象类型为 java.util.Map 及其子类类型的依赖对象<props>
简化的<map>
,它的 key 值只能指定为 String 类型<null/>
空元素,若要注入为 null 的值,需要显式指定
其他属性
depends-on
显式地指定 bean 之间的 依赖关系
autowire
Spring 根据 bean 定义的特点将相互依赖的 bean 自动绑定
不需要手动明确指定 bean 之间的依赖关系
dependency-check
bean 可以对其所依赖的对象进行最终检查
lazy-init
主要针对 ApplicationContext 容器中的 bean 的初始化行为进行控制
纵向关系
对象存在继承的关系,在XML 中可以使用模版定义表示抽象类,如下:
<bean id="newsProviderTemplate" abstract="true">
<property name="newsPersister">
<ref bean="djNewsPersister"/>
</property>
</bean>
<bean id="superNewsProvider" parent="newsProviderTemplate" class="..FXNewsProvider">
<property name="newsListener">
<ref bean="djNewsListener"/>
</property>
</bean>
<bean id="subNewsProvider" parent="newsProviderTemplate" class="..SpecificFXNewsProvider">
<property name="newsListener">
<ref bean="specificNewsListener"/>
</property>
</bean>
注意:
如果将 bean 配置成 abstract,那么 IoC 容器就不能实例化该 bean。