spring中进行依赖注入主要分为两种方式,一种是xml配置的形式,一种是注解的形式。注解的形式凭借其简洁的形式已经成为了当今开发的主流,但是当我们引入第三方类库的时候,也可以添加bean注解,但是建议使用xml的形式,这样的好处是可以尽量对第三方包或者服务的细节减少理解,可以使代码更加清晰明朗,所以掌握xml注入依赖还是非常必要的

理解了xml配置的重要性后,一起来学习一下

xml依赖注入分为两种方式

  1. 通过有参构造函数注入
  2. 通过setter方法注入
有参构造函数注入

      为了展示实例的全面性,所以我们给Student类添加了一些属性,这些属性没有实际意义,但每一个属性就代表一种类型,Student类如下所示:

public class Student {
    //普通类型
    private String name;
    //自定义类型
    private Test test;
    //下面全为集合类型
    //List类型
    private List<Integer> list;
    //Array类型
    private Integer[] integers;
    //Map类型
    private Map<String,String> map;
    //Set类型
    private Set<String> set;
    //Prop类型
    private Properties properties;
	
	//构造函数
    public Student(String name, Test test, List<Integer> list, Integer[] integers, Map<String, String> map, Set<String> set, Properties properties) {
        this.name = name;
        this.test = test;
        this.list = list;
        this.integers = integers;
        this.map = map;
        this.set = set;
        this.properties = properties;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", test=" + test +
                ", list=" + list +
                ", integers=" + Arrays.toString(integers) +
                ", map=" + map +
                ", set=" + set +
                ", properties=" + properties +
                '}';
    }
}

注意:通过分析Student类型,可以看到我把属性主要分成了以下几种类型:

  1. 普通类型
  2. 自定义类型
  3. 集合类型

自定义类型Test代码:

public class Test {
    private String test;

    public Test(String test) {
        this.test = test;
    }
}

下面就来看看xml文件中如何去通过有参构造函数进行依赖的注入:
xml配置文件:

<!--自定义类型Test-->
    <bean id="test" class="bean.Test">
        <constructor-arg name="test" value="test"></constructor-arg>
    </bean>

    <!--Student类型-->
    <bean id="student" class="bean.Student">
        <!--普通类型-->
        <constructor-arg name="name" value="张三"></constructor-arg>
        <!--自定义类型-->
        <constructor-arg name="test" ref="test"></constructor-arg>
        <!--list类型-->
        <constructor-arg name="list">
             <list>
                 <value>2</value>
                 <value>4</value>
                 <value>5</value>
             </list>
        </constructor-arg>
        <!--array类型-->
        <constructor-arg name="integers">
            <array>
                <value>1</value>
                <value>2</value>
                <value>3</value>
            </array>
        </constructor-arg>
        <!--map类型-->
        <constructor-arg name="map">
            <map>
                <entry key="zhangsan" value="zhangsan123"></entry>
                <entry key="lisi" value="lisi123"></entry>
            </map>
        </constructor-arg>
        <!--set类型-->
        <constructor-arg name="set">
            <set>
                <value>aaa</value>
                <value>bbb</value>
                <value>ccc</value>
            </set>
        </constructor-arg>
        <!--prop类型-->
        <constructor-arg name="properties">
            <props>
                <prop key="111">111</prop>
                <prop key="222">222</prop>
            </props>
        </constructor-arg>
    </bean>

      如果该类中有自定义类型的成员变量的话,就需要先定义自定义类型的bean,然后将该bean作为Student的属性,层级关系和Java中的类和属性是相同的。

运行结果:

java xml注入bean spring xml注入_xml

setter方法注入依赖

      首先,我们需要为Student类的每一个成员变量生成set方法,这里省略。

      同时,我们还需要为该类提供一个无参构造函数,因为setter注入其实是先无参实例化对象,然后才使用set方法注入依赖。原本我们不实现构造函数的时候,jdk会为该类自动生成一个默认的构造函数,但是当我们实现了构造函数的时候,jdk就不再提供,所以这块我们还需要提供一个无参构造函数。

      如果不提供无参构造函数,则会报错:

java xml注入bean spring xml注入_xml_02

我们使用setter方法进行依赖注入时,所用到的标签是property
下面看一下xml文件中如何进行依赖注入:

<!--自定义类型Test-->
    <bean id="test" class="bean.Test">
        <property name="test" value="test"></property>
    </bean>

    <!--Student类型-->
    <bean id="student" class="bean.Student">
        <!--普通类型-->
        <property name="name" value="王五"></property>
        <!--自定义类型-->
        <property name="test" ref="test"></property>
        <!--list类型-->
        <property name="list">
            <list>
                <value>12</value>
                <value>13</value>
            </list>
        </property>
        <!--array类型-->
        <property name="integers">
            <array>
                <value>1</value>
                <value>2</value>
            </array>
        </property>
        <!--map类型-->
        <property name="map">
            <map>
                <entry key="1" value="1"></entry>
                <entry key="2" value="2"></entry>
            </map>
        </property>
        <property name="set">
            <set>
                <value>2</value>
                <value>3</value>
            </set>
        </property>
        <property name="properties">
            <props>
                <prop key="1">2</prop>
                <prop key="2">3</prop>
            </props>
        </property>
    </bean>

运行结果:

java xml注入bean spring xml注入_spring_03