spring的依赖注入

如果是经常变化的数据,并不适用于注入的方式

能注入的数据有三类

  • 基本类型和String
  • 其他bean类型(在配置文件或者注解配置过的bean)
  • 复杂类型/集合类型

注入方式

  • 使用构造函数提供
  • 使用set方法提供
  • 使用注解提供

构造函数注入

就是使用类中的构造函数,给成员变量赋值。注意,赋值的操作不是我们自己做的,而是通过配置的方式,让 spring 框架来为我们注入。

优势:在获取bean对象时,注入数据是必须的操作,否则对象无法创建成功

缺点:改变了bean对象的实例化方式,使我们创建对象时,如果用不到这些数据,也必须提供。

要求:类中需要提供一个对应参数列表的构造函数。

标签:constructor-arg,它的属性有:

  • index:指定参数在构造函数参数列表的索引位置,索引位置从0开始

  • type:指定参数在构造函数中的数据类型,该数据类型也是构造函数中某个或某些参数的类型

  • name:指定参数在构造函数中的名称

  • value:它能赋的值是基本数据类型和 String 类型

  • ref:它能赋的值是其他 bean 类型,也就是说,必须得是在配置文件中配置过的 bean

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class user {
//如果是经常变化的数据,并不适用于注入的方式
private String name;
private Integer age;
private Date birthday;
public user(String name, Integer age, Date birthday) {
this.name = name;
this.age = age;
this.birthday = birthday;
}
}

<!--配置user,构造函数注入-->
<bean id="user" class="cn.hxx.domain.user">
<constructor-arg name="name" value="韩晓璇"/>
<constructor-arg name="age" value="18"/>
<constructor-arg name="birthday" ref="date"/>
</bean>
<!--配置一个日期对象-->
<bean id="date" class="java.util.Date"></bean>

set方法注入

  1. 在类中提供需要注入成员的 set 方法,通过配置文件给 bean 中的属性传值:使用 set 方法的方式

  2. 涉及的标签:property

    name:找的是类中 set 方法后面的部分

    ref:给属性赋值是其他 bean 类型的

    value:给属性赋值是基本数据类型和 string 类型的

  3. 优势:创建对象没有明显的限制,可以直接使用默认构造函数

  4. 缺点:如果某个成员必须有值,则获取对象时可能set方法没有执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class user1 {
//如果是经常变化的数据,并不适用于注入的方式
private String name;
private Integer age;
private Date birthday;
public void setName(String name) {
this.name = name;
}

public void setAge(Integer age) {
this.age = age;
}

public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
<!--set方法注入-->
<bean id="user1" class="cn.hxx.domain.user1">
<property name="age" value="18"></property>
<property name="name" value="韩晓璇"></property>
<property name="birthday" ref="date"></property>
</bean>

复杂方式注入

注入集合数据:list结构的:array、list、set;Map结构的:map、entry、props、prop

在注入集合数据时,只要结构相同,标签可以互换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class user2 {
private String[] myStrs;
private List<String> myList;
private Set mySet;
private Map<String,String> myMap;
private Properties myProps;
//提供setter方法
//....
}
<bean id="user3" class="cn.hxx.domain.user2">
<property name="myStrs">
<array>
<value>AAA</value>
</array>
</property>

<property name="myList">
<list>
<value>AAA</value>
</list>
</property>
<property name="myMap">
<map>
<entry key="testa" value="aaa"></entry>
<entry key="testb">
<value>bbb</value>
</entry>
</map>
</property>
<property name="myProps">
<props>
<prop key="ccc">ccc</prop>
</props>
</property>
</bean>