在使用JavaConfig的时候,要创建一个带有@Configuration注解的类;而在XML配置中,意味着要创建一个XML文件,并且要以<\beans>元素为根。在这个根元素中可以声明多个<\bean>:
<?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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--声明一个简单的bean-->
<bean class="org.springaction.Juggler"/>
</beans>
因为没有明确给定ID,所以这个bean将会根据全限定类名进行命名。这个简单的bean的ID将会是”org.springaction.Juggler#0”,其中“#0”是一个计数的形式,用来区分相同类型的其他bean。
如果稍后要引用该bean的话,最好使用id属性,为每个bean设置一个自定义的名字,作为该bean在Spring容器中的引用:
<!--声明一个简单的bean-->
<bean id="duke" class="org.springaction.Juggler"/>
当Spring发现这个<\bean>元素时,它将会调用Juggler的默认构造器来创建bean。
一、构造器注入bean引用
通过使用<\constructor-arg>元素来告诉Spring在构造bean时,不再只是使用默认无参的构造函数。
public Juggler(CompactDisc cd,CDPlat cdPlat){
this.cd=cd;
this.cdPlat=cdPlat;
}
<bean id="duke" class="org.springaction.Juggler">
<!--将多个bean注入到构造器-->
<constructor-arg ref="sgtPeppers"/>
<constructor-arg ref="cdPlat"/>
</bean>
<bean id="sgtPeppers" class="org.springaction.SgtPeppers"/>
<bean id="cdPlat" class="org.springaction.CDPlat"/>
可以看到<\constructor-arg>元素比较冗长,可以使用c-命名空间更简洁地描述构造器参数。但是要在XML的顶部申明其模式:
//将该声明添加到顶部
xmlns:c="http://www.springframework.org/schema/c"
对之前的配置进行修改:
<!--利用c命名空间将多个bean注入到构造器-->
<bean id="duke" class="org.springaction.Juggler"
c:cd-ref="sgtPeppers"
c:cdPlat-ref="cdPlat"/>
<bean id="sgtPeppers" class="org.springaction.SgtPeppers"/>
<bean id="cdPlat" class="org.springaction.CDPlat"/>
对c命名空间说明一下:属性名以c:开头,也就是命名空间的前缀。接下来就是要装配的构造器参数名,在此之后”-ref”,告诉Spring这是一个bean的引用。
这个其中比较困扰的是它直接引用构造器参数的名称,如果参数的名称修改了,此处的配置也要进行修改,因此可以使用参数在整个参数列表中的位置:
<bean id="duke" class="org.springaction.Juggler"
c:_0-ref="sgtPeppers"
c:_1-ref="cdPlat"/>
将参数的名字换成索引,从0开始,但是不允许将数字作为第一个字符,所以添加一个下划线作为前缀。这样,即使构造参数的名字发生变化,只要顺序保持不变,配置依然有效。
如果只是有一个构造器参数,可以不用标识参数索引:
<bean id="duke" class="org.springaction.Juggler"
c:_-ref="sgtPeppers"/>
二、将字面量注入到构造器中:
同样,先使用<\constructor-arg>元素进行构造器参数的注入:
public Juggler(int beanbags,String name){
this.beanbags=beanbags;
this.name=name;
}
<bean id="duke" class="org.springaction.Juggler">
<!--要按照构造器方法参数列表的顺序-->
<constructor-arg value="10"/>
<constructor-arg value="what'up"/>
</bean>
使用c-命名空间对例子进行修改:
<!--利用c命名空间将多个字面量注入到构造器-->
<bean id="duke" class="org.springaction.Juggler"
c:beanbags="10"
c:name="what'up"/>
也可以通过参数索引装配相同的字面量值:
<bean id="duke" class="org.springaction.Juggler"
c:_0="10"
c:_1="what'up"/>
三、同时装配bean和字面量
使用<\constructor-arg>元素进行构造器参数的注入
public Juggler(int beanbags,String name,CompactDisc cd,CDPlat cdPlat){
this.beanbags=beanbags;
this.name=name;
this.cd=cd;
this.cdPlat=cdPlat;
}
<bean id="duke" class="org.springaction.Juggler">
<constructor-arg value="19"/>
<constructor-arg value="what'up"/>
<constructor-arg ref="sgtPeppers"/>
<constructor-arg ref="cdPlat"/>
</bean>
利用c-命名空间对其进行修改:
<bean id="duke" class="org.springaction.Juggler"
c:beanbags="18"
c:name="what'up"
c:_2-ref="sgtPeppers"
c:_3-ref="cdPlat"/>