1、创建XML配置规范
在使用XML为Spring装配bean之前,需要创建一个新的配置规范。在使用JavaConfig的时候,这意味着要创建一个带有@Configuration注解的类,而在XML配置中,这意味着要创建一个XML文件,并且要以beans元素为根。
<?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">
<!-- ... -->
</beans>
2、声明一个简单的bean
要在基于XML的Spring配置中声明一个bean,我们要使用spring-beans模式中的另外一个元素:bean。bean元素类似于JavaConfig中的@Bean注解。我们可以按照如下的方式声明CompactDisc bean:
<bean id="compactDisc" class="soundsystem.SgtPeppers" />
当Spring发现这个bean元素时,它将会调用SgtPeppers的默认构造器来创建bean。
3、借助构造器注入初始化的bean
(1)构造器注入bean的引用
1)使用constructor-arg元素:
<bean id="cdPlayer" class="soundsystem.CDPlayer">
<constructor-arg ref="compactDisc"/>
</bean>
2)使用Spring3.0所引入的c-命名空间:
<bean id="cdPlayer" class="soundsystem.CDPlayer"
c:cd-ref="compactDisc"/>
属性名以c:开头,也就是命名空间的前缀。接下来就是要装配的构造器参数名,在此之后”-ref”,告诉Spring正在装配的是一个bean的引用。
在这里它直接引用构造器参数的名称即上面的”cd”,如果参数的名称修改了,此处的配置也要进行修改,因此可以使用参数在整个参数列表中的位置来替代:
<bean id="cdPlayer" class="soundsystem.CDPlayer"
c:_0-ref="compactDisc"/>
如果只有一个构造器参数则可以使用下面的方案:
<bean id="cdPlayer" class="soundsystem.CDPlayer"
c:_-ref="compactDisc"/>
注:使用c-命名空间需要先在XML的顶部声明其模式:
xmlns:c="http://www.springframework.org/schema/c"
(2)将字面量注入到构造器中
package soundsystem;
public class BlankDisc implements CompactDisc {
private String title;
private String artist;
public BlankDisc(String title, String artist) {
this.title = title;
this.artist = artist;
}
}
1) 使用constructor-arg元素:
<bean id="compactDisc" class="soundsystem.BlankDisc">
<constructor-arg value="Sgt. Pepper's Lonely Hearts Club Band"/>
<constructor-arg value="The Beatles"/>
</bean>
2)使用c-命名空间:
<bean id="compactDisc" class="soundsystem.BlankDisc"
c:_title="Sgt. Pepper's Lonely Hearts Club Band"
c:_artist="The Beatles"/>
或
<bean id="compactDisc" class="soundsystem.BlankDisc"
c:_0="Sgt. Pepper's Lonely Hearts Club Band"
c:_1="The Beatles"/>
如果只有一个构造器参数:
<bean id="compactDisc" class="soundsystem.BlankDisc"
c:_="Sgt. Pepper's Lonely Hearts Club Band"/>
(3)装配集合
package soundsystem;
import java.util.List;
import soundsystem.CompactDisc;
public class BlankDisc implements CompactDisc {
private String title;
private String artist;
private List<String> tracks;
public BlankDisc(String title, String artist, List<String> tracks) {
this.title = title;
this.artist = artist;
this.tracks = tracks;
}
}
1)使用list元素将其声明为一个列表(目前,使用c-命名空间的属性无法实现装配集合的功能)。
<bean id="compactDisc" class="soundsystem.BlankDisc">
<constructor-arg value="Sgt. Pepper's Lonely Hearts Club Band"/>
<constructor-arg value="The Beatles"/>
<constructor-arg>
<list>
<value>one</value>
<value>two</value>
<value>three</value>
...
<value>n</value>
</list>
<constructor-arg/>
</bean>
或
<bean id="compactDisc" class="soundsystem.BlankDisc">
<constructor-arg value="Sgt. Pepper's Lonely Hearts Club Band"/>
<constructor-arg value="The Beatles"/>
<constructor-arg>
<set>
<value>one</value>
<value>two</value>
<value>three</value>
...
<value>n</value>
</set>
<constructor-arg/>
</bean>
2)使用ref元素替代value,从而实现bean引用列表的装配。
假设现在有一个Discography类,它的构造器如下:
public Discography(String artist, List<CompactDisc cds) { ... }
那么可以以如下的方式配置它的bean:
<bean id="compactDisc" class="soundsystem.BlankDisc">
<constructor-arg value="The Beatles"/>
<constructor-arg>
<list>
<ref bean="sgtPeppers"/>
<ref bean="whiteAlbum"/>
...
<ref bean="revolver"/>
</list>
<constructor-arg/>
</bean>
(4)设置属性
(1)setter方法注入bean的引用:
package soundsystem;
import soundsystem.CompactDisc;
import soundsystem.MediaPalyer;
import org.springframework.beans.factory.annotation.Autowired;
public class CDPlayer implements MediaPalyer {
private CompactDisc compactDisc;
@Autowired
public void setCompactDisc(CompactDisc compactDisc) {
this.compactDisc = compactDisc;
}
}
在这之前都是通过构造器来进行注入的,没有使用属性的setter方法,现在我们来看一下如何使用spring XML实现属性的注入。property元素为属性的setter方法所提供的功能与constructor-arg元素为构造器所提供的功能是一样的。
<bean id="cdPlayer" class="soundsystem.CDPlayer">
<property name="compactDisc" ref="compaceDisc" />
</bean>
(2)setter方法将字面量注入到属性中:
package soundsystem;
import java.util.List;
import soundsystem.CompactDisc;
public class BlankDisc implements CompactDisc {
private String title;
private String artist;
private List<String> tracks;
public void setTitle(String title) {
this.title = title;
}
public void setArtist(String artist) {
this.artist = artist;
}
public void setTracks(List<String> tracks) {
this.tracks = tracks;
}
}
这里和先前的constructor-arg装配tracks是完全一样的:
<bean id="compactDisc" class="soundsystem.BlankDisc">
<property name="title" value="Sgt. Pepper's Lonely Hearts Club Band" />
<property name="artist" value="The Beatles" />
<property name="tracks">
<list>
<value>one</value>
<value>two</value>
<value>three</value>
...
<value>n</value>
</list>
</property>
</bean>