EchoDemo's Blogs

装配Bean之通过XML装配Bean

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>
🐶 您的支持将鼓励我继续创作 🐶
-------------本文结束感谢您的阅读-------------