Spring学习4-依赖注入

依赖注入概念

依赖注入: Dependency Injection ,它是spring框架核心IoC的具体实现。

通过控制反转,把对象的创建交给了spring,但是代码中不可能出现没有依赖的情况,IoC解耦只是降低他们的依赖关系,但不会消除。例如业务层仍会调用持久层的方法,那么使用spring去维护这种业务层和持久层的依赖关系,就是DI的作用。

简单的说,就是坐等框架把对象传入,而不用我们自己去获取。

注入的方式

通过构造函数注入

涉及的标签:constructor-arg,该标签是写在bean标签内部的子标签
标签的属性:

  • type:指定要注入的参数在构造函数中的类型
  • index:指定要注入的参数在构造函数的索引位置
  • name:指定参数在构造函数中的名称
  • value:指定注入的数据内容,只能指定基本类型数据和String类型数据
  • ref:指定其他bean类型数据,写的是其他bean的id,其他bean指的是存在于spring容器中的bean
1
2
3
4
5
6
7
8
9
10
// 业务层
private String name;
private Integer age;
private Date birthday;

public AccountServiceImpl(String name, Integer age, Date birthday) {
this.name = name;
this.age = age;
this.birthday = birthday;
}
1
2
3
4
5
6
7
<bean id="accountService" class="com.gsynf.service.impl.AccountServiceImpl">
<constructor-arg name="name" value="gsynf"></constructor-arg>
<constructor-arg name="age" value="18"></constructor-arg>
<constructor-arg name="birthday" ref="now"></constructor-arg>
</bean>

<bean id="now" class="java.util.Date"></bean>

通过set方法注入

涉及的标签:property,该标签是写在bean标签内部的子标签
标签的属性:

  • name:指定的是set方法的名称,匹配的是类中set后面的部分
  • value:指定注入的数据内容,只能指定基本类型数据和String类型数据
  • ref:指定其他bean类型数据,写的是其他bean的id,其他bean指的是存在于spring容器中的bean
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 业务层
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;
}
1
2
3
4
5
<bean id="accountService2" class="com.gsynf.service.impl.AccountServiceImpl2">
<property name="name" value="gsynf"></property>
<property name="age" value="18"></property>
<property name="birthday" ref="now"></property>
</bean>

另:

1
2
3
4
5
6
7
8
9
10
<!-- 约束中导入p名称空间 -->
……
xmlns:p="http://www.springframework.org/schema/p"
……

<!-- 使用p名称空间注入
它的本质仍然是需要类中提供set方法,同时在配置文件中要导入p名称空间 -->
<bean id="accountService3" class="com.gsynf.service.impl.AccountServiceImpl3"
p:name="gsynf" p:age="18" p:birthday-ref="now">
</bean>

通过注解方式注入

这部分在spring的注解会讲到。

注入的内容

基本类型和String类型

如上

其他的bean类型

1
2
3
4
5
6
// 业务层
private IAccountDao accountDao = null;

public void setAccountDao(IAccountDao accountDao) {
this.accountDao = accountDao;
}
1
2
3
<bean id="accountService" class="com.gsynf.service.impl.AccountServiceImpl">
<property name="accountDao" ref="accountDao"></property>
</bean>

以后开发中,业务层调用持久层交给spring处理会经常采用这种类型。

复杂类型(集合类型)

这个和注入方式没有关系,只是注入的内容变得复杂。

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
36
37
38
39
40
41
42
43
44
	 <bean id="accountService4" class="com.gsynf.service.impl.AccountServiceImpl4">
<!-- 给数组注入数据 -->
<property name="myStrs">
<array>
<value>AAA</value>
<value>BBB</value>
<value>CCC</value>
</array>
</property>
<!-- 给list集合注入数据 -->
<property name="myList">
<list>
<value>AAA</value>
<value>BBB</value>
<value>CCC</value>
</list>
</property>
<!-- 给Set集合注入数据 -->
<property name="mySet">
<set>
<value>AAA</value>
<value>BBB</value>
<value>CCC</value>
</set>
</property>
<!-- 给Map集合注入数据 -->
<property name="myMap">
<map>
<entry key="testA" value="AAA"></entry>
<entry key="testB" value="BBB"></entry>
<entry key="testC">
<value>CCC</value>
</entry>
</map>
</property>
<!-- 给property集合注入数据 -->
<property name="myProps">
<props>
<prop key="testA">AAA</prop>
<prop key="testB">BBB</prop>
<prop key="testC">CCC</prop>
</props>
</property>
</bean>
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
// 业务层
private String[] myStrs;
private List<String> myList;
private Set<String> mySet;
private Map<String,String> myMap;
private Properties myProps;

public void setMyStrs(String[] myStrs) {
this.myStrs = myStrs;
}

public void setMyList(List<String> myList) {
this.myList = myList;
}

public void setMySet(Set<String> mySet) {
this.mySet = mySet;
}

public void setMyMap(Map<String, String> myMap) {
this.myMap = myMap;
}

public void setMyProps(Properties myProps) {
this.myProps = myProps;
}
@Override
public void saveAccount() {
System.out.println(Arrays.toString(myStrs));
System.out.println(myList);
System.out.println(mySet);
System.out.println(myMap);
System.out.println(myProps);

}
1
2
3
4
5
6
// 运行结果
[AAA, BBB, CCC]
[AAA, BBB, CCC]
[AAA, BBB, CCC]
{testA=AAA, testB=BBB, testC=CCC}
{testB=BBB, testC=CCC, testA=AAA}

:转载文章请注明出处,谢谢~