spring中进行依赖注入主要分为两种方式,一种是xml配置的形式,一种是注解的形式。注解的形式凭借其简洁的形式已经成为了当今开发的主流,但是当我们引入第三方类库的时候,也可以添加bean注解,但是建议使用xml的形式,这样的好处是可以尽量对第三方包或者服务的细节减少理解,可以使代码更加清晰明朗,所以掌握xml注入依赖还是非常必要的
理解了xml配置的重要性后,一起来学习一下
xml依赖注入分为两种方式
- 通过有参构造函数注入
- 通过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类型,可以看到我把属性主要分成了以下几种类型:
- 普通类型
- 自定义类型
- 集合类型
自定义类型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中的类和属性是相同的。
运行结果:
setter方法注入依赖
首先,我们需要为Student类的每一个成员变量生成set方法,这里省略。
同时,我们还需要为该类提供一个无参构造函数,因为setter注入其实是先无参实例化对象,然后才使用set方法注入依赖。原本我们不实现构造函数的时候,jdk会为该类自动生成一个默认的构造函数,但是当我们实现了构造函数的时候,jdk就不再提供,所以这块我们还需要提供一个无参构造函数。
如果不提供无参构造函数,则会报错:
我们使用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>
运行结果: