依赖注入(Dependency Injection,DI)和控制反转含义相同,它们是从两个角度描述的同一个概念。
当某个JAVA实例需要另一个 Java 实例时,传统的方法是由调用者创建被调用者的实例(例如,使用 new 关键字获得被调用者实例),而使用Spring框架后,被调用者的实例不再由调用者创建,而是由 Spring 容器创建,这称为控制反转。
Spring 容器在创建被调用者的实例时,会自动将调用者需要的对象实例注入给调用者,这样,调用者通过 Spring 容器获得被调用者实例,这称为依赖注入。
依赖注入主要有两种实现方式,分别是属性 setter 注入和构造方法注入。具体介绍如下。
1)属性 setter 注入
指 IoC 容器使用 setter 方法注入被依赖的实例。通过调用无参构造器或无参 static 工厂方法实例化 bean 后,调用该 bean 的 setter 方法,即可实现基于 setter 的 DI。
1. 创建 PersonService 接口
1.
2.
public interface PersonService {
3.
public void addPerson();
4.
}
2. 创建接口实现类 PersonServiceImpl
1.
package com.mengma.ioc;
2.
public class PersonServiceImpl implements PersonService {
3.
// 定义接口声明
4.
private PersonDao personDao;
5.
// 提供set()方法,用于依赖注入
6.
public void setPersonDao(PersonDao personDao) {
7.
this.personDao = personDao;
8.
}
9.
// 实现PersonService接口的方法
10.
@Override
11.
public void addPerson() {
12.
// 调用PersonDao中的add()方法
13.
"addPerson()执行了...");
14.
}
15.
}
上述代码中,首先声明了 personDao 对象,并为其添加 setter 方法,用于依赖注入,然后实现了 PersonDao 接口的 addPerson() 方法,并在方法中调用 save() 方法和输出一条语句。
3. 在 applicationContext.xml 中添加配置信息
1.
<bean id="personService" class="com.mengma.ioc.PersonServiceImpl">
2.
<!-- 将personDao实例注入personService实例中 -->
3.
<property name="personDao" ref="personDao"/>
4.
</bean>
4. 编写测试方法
1.
public void test2() {
2.
// 定义Spring配置文件的路径
3.
"applicationContext.xml";
4.
// 初始化Spring容器,加载配置文件
5.
new ClassPathXmlApplicationContext(
6.
xmlPath);
7.
// 通过容器获取personService实例
8.
PersonService personService = (PersonService) applicationContext
9.
"personService");
10.
// 调用personService的addPerson()方法
11.
personService.addPerson();
12.
}
2)构造方法注入
指 IoC 容器使用构造方法注入被依赖的实例。基于构造器的 DI 通过调用带参数的构造方法实现,每个参数代表一个依赖。
1.
package com.mengma.ioc;
2.
public class PersonServiceImpl implements PersonService {
3.
// 定义接口声明
4.
private PersonDao personDao;
5.
// 提供有参构造器,用于依赖注入
6.
public PersonServiceImpl(PersonDao personDao) {
7.
this.personDao = personDao;
8.
}
9.
// 实现PersonService接口的方法
10.
@Override
11.
public void addPerson() {
12.
// 调用PersonDao中的add()方法
13.
"addPerson()执行了...");
14.
}
15.
}
1.
<bean id="personService" class="com.mengma.ioc.PersonServiceImpl">
2.
<!-- 将personDao实例注入personService实例中 -->
3.
"personDao"/>
4.
</bean>
3)接口注入