什么是DI


  • DI 也就是​​依赖注入​​,有一个那么高大上的词,其实也就是给类当中的属性设置值,前提条件下这个类必须要是 Spring 进行管理的
  • 前提必须有​​IOC​​ 的环境
  • 这个类被 Spring 管理的时候,才可以进行属性值注入也就是设置值
  • 依赖注入:就是对 Spring 管理的类,通过配置文件的形式进行赋值的过程


传统的方式


  • 接着上一篇文章的代码
  • 修改​​top.it6666.service.impl​​​ 目录下的​​UserDaoMySQLImpl​​​ 实现类,添加一个字段​​name​
  • 有 get/set 才叫属性没有就是叫字段


/**
* @author: BNTang
**/
public class UserDaoMySQLImpl implements UserDao {

public String name;

...
}


  • 修改测试类的代码如下:


/**
* @author: BNTang
**/
public class UserDaoTest {
@Test
public void save() {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

// 使用面向接口编程是没有办法设置属性值,所以我就以实现类来接收了
UserDaoMySQLImpl userDaoMySQL = (UserDaoMySQLImpl) applicationContext.getBean("userDao");
userDaoMySQL.name = "BNTang";

System.out.println(userDaoMySQL.name);
}
}

DI的方式


  • 实现类当中的属性要提供​​set方法​
  • 意思是如果要使用 DI 进行依赖注入,必须给字段提供 set 方法,因为它底层无非也就是需要调用 set 方法


/**
* @author: BNTang
**/
public class UserDaoMySQLImpl implements UserDao {

...

public void setName(String name) {
this.name = name;
}

...
}


  • 在配置文件当中配置依赖注入,修改​​applicationContext.xml​
  • 通过一个​​property​​ 的标签进行配置
  • 这个标签有两个属性一个​​name​​​ 一个​​value​


  • name:需要注入的属性名称
  • value:需要注入的值
...

<bean id="userDao" class="top.it6666.service.impl.UserDaoMySQLImpl">
<property name="name" value="BNTang"/>
</bean>

...


  • 修改测试类代码如下:


/**
* @author: BNTang
**/
public class UserDaoTest {
@Test
public void save() {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

UserDaoMySQLImpl userDaoMySQL = (UserDaoMySQLImpl) applicationContext.getBean("userDao");
System.out.println(userDaoMySQL.name);
}
}