在我们经过了:
的学习之后,已经对Spring的Ioc容器有了一定的了解,我们队容器如何创建对象有了细致的了解,接下来就是一些其他零零散散的东西,这一期就主要讲解Spring IoC容器的XML配置文件。
其实,Spring的配置文件是Spring容器对Bean进行生产以及关系注入的图纸,他是Spring的基础。如果我们没有配置文件的话,则Spring的容器将无从谈起。
Spring 的配置文件是用于指导 Spring 工厂进行 Bean 的生产、依赖关系注入及 Bean 实例分发的“图纸”, J2EE 程序员必须学会并灵活应用这份“图纸”,准确地表达自己的“生产意图”。它是一个或多个标准的XML文档,其ApplicationContext.xml是Spring的默认配置文件,当容器启动时找不到其他的配置文件时,则会尝试加载这个默认的配置文件。
Spring容器成功启动需要以下三方面的条件同时具备:
Spring启动时读取应用程序提供的Bean的配置信息,并在Spring容器中生成一份相应的Bean的配置注册表,然后根据这张注册表来实例化Bean,装配好Bean之间的依赖关系,为上层应用提供准备就绪的运行环境。
而bean的配置信息就是Bean的元数据信息,他由以下五个方面来组成:
接下来是他们之间的相互关系:
上面这些信息引用自:Spring学习(十二)Spring 的配置文件概述
标签开始在我们知道了Spring的配置文件是什么之后,我们就开始自顶向下的逐步讲解Spring的配置文件中的标签,为什么要从
标签开始呢,因为我们每一个类对应到配置文件中都是一个
标签,而多个
标签j就组成了
,
是XML配置文件中最顶层的元素,它下面可以包含0或者1个
和多个
以及
或者
,如图所示:
标签可以通过相应的属性对
进行统一的默认行为配置,他的属性有一下几个:
、
和
1、
可以通过
在配置的文件中指定一些描述性的信息。通常情况下,该元素是省略的。当然,如果愿意,
随时可以为我们效劳。
2、
通常情况下,可以根据模块功能或者层次关系,将配置信息分门别类地放到多个配置文件中。在想加载主要配置文件,并将主要配置文件所依赖的配置文件同时加载时,可以在这个主要的配置文件中通过
元素对其所依赖的配置文件进行引用。比如,如果A.xml
中的
定义可能依赖B.xml
中的某些
定义,那么就可以在A.xml
中使用
将B.xml
引入到A.xml
,以类似于
的形式。但是,这个功能价值不大,因为容器实际上可以同时加载多个配置,没有必要非通过一 个配置文件来加载所有配置。不过,或许在有些场景中使用这种方式比较方便也说不定。
3、
可以通过
为某些
起一些“外号”(别名),通常情况下是为了减少输入。比如,假设有个
,它的名称为dataSourceForMasterDatabase
,你可以为其添加一个
,像这样
。以后通过dataSourceForMasterDatabase
或者masterDataSource
来引用这个
都可以,只要你觉得方便就行。
标签首先我们来看一下如何定义一个
标签:
<bean id="djNewsListener" class="..impl.DowJonesNewsListener">
bean>
然后我们就来学习一下
标签中的属性:
1、id
属性:我们通过id
属性来作为唯一标识,也就是起一个名字,相当于这个
的名字。id
的命名规则:
2、name
属性:是不是有点糊涂了,既然有name
属性,我们为啥还要id
属性,其实name
属性基本已经不用了,所以我们通过id
来当做名字就可以了。
3、class
属性:每个注册到容器的对象都需要通过
元素的class
属性指定其类型,否则,容器可不知道这个对象到底是何方神圣。在大部分情况下,该属性是必须的。
标签下的子标签
:我们可以通过这个标签进行依赖对象的构造器注入,示例如下:<bean id="djNewsProvider" class="..FXNewsProvider">
<constructor-arg>
<ref bean="djNewsListener"/>
constructor-arg>
<constructor-arg>
<ref bean="djNewsPersister"/>
constructor-arg>
bean>
从这个实例中我们可以看出djNewsProvider
这个bean
中有两个依赖对象,和以这两个依赖对象为参数的构造方法,两个对象分别是:djNewsListener
和djNewsPersister
。其中的标签我们马上讲解。
标签中有两个属性:
type
属性:假如一个类中有两个构造方法,那么我们就可以使用type
属性来指定调用构造方法的参数类型,这样就可以按照自己的喜好来指定构造方法。示例如下:<bean id="mockBO" class="..MockBusinessObject">
<constructor-arg type="int">
<value>111111value>
constructor-arg>
bean>
这里指定调用了构造器参数为int
类型的构造器。
index
属性:当当前
对象的构造器有多个相同参数的构造方法时,我们就可以是有index
标签来指定构造器方法的参数顺序。示例如下:<bean id="mockBO" class="..MockBusinessObject">
<constructor-arg index="1" value="11111"/>
<constructor-arg index="0" value="22222"/>
bean>
这里我们就指定了第一个参数的值为22222
,第二个参数的值为11111
。
:我们可以通过这个标签来进行setter方法的依赖注入,示例如下:id="djNewsProvider" class="..FXNewsProvider"> 2
<property name="newsListener">
<ref bean="djNewsListener"/>
property>
<property name="newPersistener">
<ref bean="djNewsPersister"/>
property>
这里的一个
就对应一个属性的setter方法。
标签有一个name
属性,用来指定当前对象的属性名称。
和
下的子标签
可以通过
为主体对象注入简单的数据类型,不但可以指定String类型的数据,而且可以指定其他Java语言中的原始类型以及它们的包装器(wrapper)类型,比如int、Integer等。容器在注入的时候,会做适当的转换工作(我们其实已经知道做这个工作的就是PropertyEditor)
我们可以通过以下两种用法来使用
标签:
第一种
<constructor-arg>
<value>111111value>
constructor-arg>
<property name="attributeName">
<value>222222value>
property>
第二种
<constructor-arg value="111111"/>
<property name="attributeName" value="222222"/>
使用来引用容器中其他的对象实例,可以通过
的
local
、parent
和bean
属性来指定引用的对象的beanName
是什么。示例如下:
constructor-arg>
<ref local="djNewsPersister"/>
constructor-arg>
或者
<constructor-arg>
<ref parent="djNewsPersister"/>
constructor-arg>
或者
<constructor-arg>
<ref bean="djNewsPersister"/>
constructor-arg>
local
、parent
和bean
的区别在于:
local
只能指定与当前配置的对象在同一个配置文件的对象定义的名称(可以获得XML解析器的id约束验证支持parent
则只能指定位于当前容器的父容器中定义的对象引用bean
则基本上通吃,所以,通常情况下,直接使用bean来指定对象引用就可以了
我可以获取spring容器中的bean的name的值(一个字符串),而不是bean的实例。
元素的功能与
类似,就是
多了验证的功能,减少配置的书写错误机率。
总之就是一句话,在我们需要spring容器中的bean的name的值时,使用
标签。
使用可以引用容器中独立定义的对象定义。但有时,可能我们所依赖的对象只有当前一个对象引用,或者某个对象定义我们不想其他对象通过
引用到它。这时,我们可以使用内嵌的
,将这个私有的对象定义仅局限在当前对象。示例如下:
<bean id="djNewsProvider" class="..FXNewsProvider">
<constructor-arg index="0">
<bean class="..impl.DowJonesNewsListener">
bean>
constructor-arg>
<constructor-arg index="1">
<ref bean="djNewsPersister"/>
constructor-arg>
bean>
、
、
这三个标签我们一看就能知道他们对应的是集合类型的参数。这里就不多举例子了,如果有疑问可以参考:Spring学习笔记(一)——IOC
是简化后了的,该元素对应配置类型为
java.util.Properties
的对象依赖。因为Properties
只能指定String类型的键(key)和值,所以,
的配置简化很多,示例如下:
"valueSet">
"author">[email protected]
"support">[email protected]
...
感觉内容实在太多了,这一次就到这里吧,接下来的一起,将会详细讲解
中的属性和其他的一些内容。