Spring揭秘-xml配置文件的说明

Spring BeanFactory的xml配置文件的说明

  • spring2.0之前使用DTD文档声明
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" ➥
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
...
</beans>
  • spring2.0以后在向前兼容的前提下又引入了XML Schema的文档声明
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:util="http://www.springframework.org/schema/util"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd">
...
</beans>
  • <beans> 是XML配置文件中最顶层的元素, 它下面可以包含0或者1个 <description> 和多个<bean> 以及 <import> 或者 <alias>


    Paste_Image.png

<beans>标签的默认属性

  • default-lazy-init 。true 或 false ,默认值为 false 。用来标志是否对所有的 <bean> 进行延迟初始化。
  • default-autowire 。取值为 no 、 byName 、 byType 、 constructor 以及 autodetect 。默认值为 no ,如果使用自动绑定的话,用来标志全体bean使用哪一种默认绑定方式。
  • default-dependency-check 。可以取值 none 、 objects 、 simple 以及 all ,默认值为 none ,即不做依赖检查。
  • default-init-method 。如果 <bean> 按照某种规则,都有同样名称的初始化方法的话,可以在这里统一指定这个初始化方法名,而不用在每一个 <bean> 上都重复单独指定。
  • default-destroy-method 。 与 default-init-method 相对应,如果所管辖的bean有按照某种规则使用了相同名称的对象销毁方法,可以通过这个属性统一指定。

<description> 、 <import> 和 <alias>

  • 这三个标签不是必须的
  • <description>配置文件的描述信息
  • <import resource="B.xml"/>在本配置文件中导入其他配置文件
  • 可以通过 <alias> 为某些 <bean> 起一些“外号”(别名)

构造方法注入

<bean id="mockBO" class="..MockBusinessObject">
<constructor-arg type="int"> <!--查找参数类型为int的构造方法-->
<value>111111</value>
</constructor-arg>
< /bean>
<bean id="mockBO" class="..MockBusinessObject">
  <constructor-arg index="1" value="11111"/> <!-- index代表构造方法参数所以位置 -->
  <constructor-arg index="0" value="22222"/>
</bean>

setter方式注入

  • <property> 有一个 name 属性, 用来指定该 <property> 将会注入的对象所对应的实例变量名称
<bean id="djNewsProvider" class="..FXNewsProvider">
  <property name="newsListener">
    <ref bean="djNewsListener"/>
  </property>
  <property name="newPersistener">
    <ref bean="djNewsPersister"/>
  </property>
< /bean>

<property> 和 <constructor-arg> 中可用的配置项

  • <value> 可以通过 value 为主体对象注入简单的数据类型
<constructor-arg>
  <value>111111</value>
</constructor-arg>
<property name="attributeName">
  <value>222222</value>
</property>

等效于

<constructor-arg value="111111"/>
<property name="attributeName" value="222222"/>
  • <ref> 。使用 ref 来引用容器中其他的对象实例,可以通过 ref 的 local 、 parent 和 bean 属性来指定引用的对象的 beanName 是什么
    • local 只能指定与当前配置的对象在同一个配置文件的对象定义的名称
      (可以获得XML解析器的 id 约束验证支持)
    • parent 则只能指定位于当前容器的父容器中定义的对象引用;

      a
      Paste_Image.png
    • bean 则基本上通吃,所以,通常情况下,直接使用bean来指定对象引用就可以了。
<constructor-arg>
  <ref local="djNewsPersister"/>
</constructor-arg>
或者
<constructor-arg>
  <ref parent="djNewsPersister"/>
</constructor-arg>
或者
<constructor-arg>
  <ref bean="djNewsPersister"/>
</constructor-arg>
  • <idref>, 容器在解析配置的时候就可以帮你检查这个 beanName 到底是否存在,而不用等到运行时才发现这个 beanName 对应的对象实例不存在
<property name="newsListenerBeanName">
  <idref bean="djNewsListener"/>
</property>
  • 内部 <bean>
<bean id="djNewsProvider" class="..FXNewsProvider">
<constructor-arg index="0">
  <!--内部bean作用域只可以被djNewsProvider引用, 其他bean无法引用该对象 -->
  <bean class="..impl.DowJonesNewsListener">
</bean>
</constructor-arg>
<constructor-arg index="1">
  <ref bean="djNewsPersister"/>
</constructor-arg>
< /bean>
  • <list> 。 <list> 对应注入对象类型为 java.util.List 及其子类或者数组类型的依赖对象。
public class MockDemoObject
{
  private List param1;
  private String[] param2;
  ...
  // 相应的setter和getter方法
  ...
}
配置类似于
<property name="param1">
  <list>
    <value> something</value>
    <ref bean="someBeanName"/>
    <bean class="..."/>
  </list>
</property>
<property name="param2">
  <list>
    <value>stringValue1</value>
    <value>stringValue2</value>
  </list>
</property>
  • <set> 对应注入Java Collection中类型为 java.util.Set 或者其子类的依赖对象
public class MockDemoObject
{
private Set valueSet;
// 必要的setter和getter方法
...
}
配置类似于
<property name="valueSet">
  <set>
    <value> something</value>
    <ref bean="someBeanName"/>
    <bean class="..."/>
    <list>
    ...
    </list>
  </set>
</property>
  • <map> 对应注入 java.util.Map 或者其子类类型的依赖对象
public class MockDemoObject
{
private Map mapping;
// 必要的setter和getter方法
...
}
配置类似于
<property name="mapping">
  <map>
    <entry key="strValueKey">
      <value>something</value>
    </entry>
    <entry>
      <key>objectKey</key>
      <ref bean="someObject"/>
    </entry>
    <entry key-ref="lstKey">
      <list>
        ...
      </list>
    </entry>
     ...
  </map>
< /property>

等效于

public class MockDemoObject
{
private Map mapping;
// 必要的setter和getter方法
...
}
配置类似于
<property name="valueSet">
  <map>
    <entry key="strValueKey" value="something"/>
    <entry key-ref="" value-ref="someObject"/>
    <entry key-ref="lstKey">
    <list>
      ...
    </list>
    </entry>
    ...
  </map>
</property>
  • <props> 。 <props> 是简化后了的 <map> ,或者说是特殊化的 map ,该元素对应配置类型为java.util.Properties 的对象依赖。因为 Properties 只能指定 String 类型的键(key)和值,所以,<props> 的配置简化很多
public class MockDemoObject
{
  private Properties emailAddrs;
  // 必要的setter和getter方法
...
}
配置类似于
<property name="valueSet">
  <props>
    <prop key="author">fujohnwang@gmail.com</prop>
    <prop key="support">support@spring21.cn</prop>
    ...
  </props>
</property>
  • <null/> 一个空元素, 对于 String 类型来说,如果通过value以这样的方式指定注入,即 <value></value> ,那么,得到的结果是 "" ,而不是 null, 所以,如果需要为这个string对应的值入 null 的话,请使用 <null/>
public class MockDemoObject
{
  private String param1;
  private Object param2;
  // 必要的setter和getter方法
  ...
}
配置为
<property name="param1">
  <null/>
</property>
<property name="param2">
  <null/>
</property>
实际上就相当于
public class MockDemoObject
{
  private String param1=null;
  private Object param2=null;
  // 必要的setter和getter方法
  ...
}

depends-on

  • 前置依赖bean, 将configSetup,configSetup2,...等多个bean在ClassA实例之前实例
  • depends-on用来指定Bean初始化及销毁时的顺序
<bean id="classAInstance" class="...ClassA" depends-on="configSetup,configSetup2,..."/>
<bean id="configSetup" class="SystemConfigurationSetup"/>
<bean id="configSetup2" class="SystemConfigurationSetup2"/>

autowire自动绑定

public class Foo
{
  private Bar emphasisAttribute;
...
// 相应的setter方法定义
}
public class Bar
{
  ...
}
那 么应该使用如下代码所演示的自动绑定定义,才能达到预期的目的:
<bean id="fooBean" class="...Foo" autowire="byName">
</bean>
<bean id="emphasisAttribute" class="...Bar">
</bean>
  • byName: 按照类中声明的实例变量的名称,与XML配置文件中声明的bean定义的 beanName 的值进行匹配相匹配的bean定义将被自动绑定到当前实例变量上.
  • byType: byType根据其他bean的类型和当前bean属性的类型进行自动装配,若IOC容器中有一个以上的类型匹配的bean,则抛异常
  • constructor: constructor 类型则是针对构造方法参数的类型而进行的自动绑定, 功能与byType类似
public class Foo
{
  private Bar bar;
  public Foo(Bar arg)
  {
    this.bar = arg;
  }
  ...
}
相应配置为
<bean id="foo" class="...Foo" autowire="constructor"/>
<bean id="bar" class="...Bar">
< /bean>
  • autodetect: 这种模式是 byType 和 constructor 模式的结合体,如果对象拥有默认无参数的构造方法,容器会
    优先考虑 byType 的自动绑定模式。否则,会使用 constructor 模式


    Paste_Image.png
  • 如果想让系统中所有的 <bean> 定义都使用 byType 模式的自动绑定,我们可以使用

<beans default-autowire="byType">
<bean id="..." class="..."/>
...
</beans>

lazy-init

  • 主要是可以针对 ApplicationContext 容器的bean初始化行为施以更多控制
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355

推荐阅读更多精彩内容