Spring DI(依赖注入)的实现方式- 使用set方法注入
依赖注入(DI)和控制反转含义相同,它们是从两个角度描述的同一个概念。
Spring 容器在创建被调用者的实例时,会自动将调用者需要的对象实例注入给调用者,这样,调用者通过 Spring 容器获得被调用者实例,这称为依赖注入。
1.导入依赖
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.1.11.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.11.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.1.11.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>5.1.11.RELEASE</version>
</dependency>
2.在 applicationContext.xml 中添加配置信息
applicationContext.xml 配置文件中添加一个 元素,用于实例化 userrDaoImpl类,并将 userdao 的实例注入到 UserDao接口中。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
<!-- 由 Spring容器创建该类的实例对象 -->
<bean id="userDao" class="com.zdq.ioc.impl.UserDaoImpl"/>
<bean id="userDao1" class="com.zdq.ioc.UserDao" abstract="true">
<!-- 将personDao实例注入personService实例中 -->
<property name="userDao" ref="userDao"/>
<!-- <bean>元素的子元素,用于调用 Bean 实例中的 Set 方法完
成属性赋值,从而完成依赖注入。该元素的 name 属性指定 Bean 实例中的相应属性名-->
</bean>
</beans>
3.创建UserDao接口
package com.zdq.ioc;
public interface UserDao {
public void diTest();
void setUserDao(String userdao);
}
4.创建接口实现类UserDaoImpl.java
package com.zdq.ioc.impl;
import com.zdq.ioc.UserDao;
public class UserDaoImpl implements UserDao {
UserDao userdao;
@Override
public void setUserDao(String UserDao) {
this.userdao=userdao;
}
@Override
public void diTest() {
System.out.println("di");
}
}
4.编写单元测试类
package com.test;
import com.zdq.ioc.UserDao;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class OneTest {
@Test
public void test2() {
// 定义Spring配置文件的路径
String xmlPath = "applicationContext.xml";
// 初始化Spring容器,加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
// 通过容器获取userDao实例
UserDao userDao= (UserDao) applicationContext.getBean("userDao");
// 调用userDao的addPerson()方法
userDao.diTest();
}
}
运行单元测试类,使用 Spring 容器获取userdao 的实例后,调用了该实例的 di() 方法,在该方法中又调用了 PersonDao 实现类中的 add() 方法,并输出了结果。这就是 Spring 容器属性 setter 注入的方式,也是实际开发中较为常用的一种方式。