接下来介绍模块DI依赖注入,首先来介绍下Spring中有哪些注入方式?我们先来思考:

  • 向一个类中传递数据的方式有几种?
  • 普通方法(set方法)
  • 构造方法
  • 依赖注入描述了在容器中建立bean与bean之间的依赖关系的过程,如果bean运行需要的是数字或字符串呢?
  • 引用类型
  • 简单类型(基本数据类型与String)

Spring就是基于上面这些知识点,为我们提供了两种注入方式,分别是:

  • setter注入
  • 简单类型
  • 引用类型
  • 构造器注入
  • 简单类型
  • 引用类型

依赖注入的方式已经介绍完,接下来介绍setter注入。

1. setter注入

  1. 对于setter方式注入引用类型的方式之前已经介绍过,快速回顾下:
  • 在bean中定义引用类型属性,并提供可访问的set方法
public class UserServiceImpl implements UserService {
    private UserDao UserDao;
    public void setUserDao(UserDao UserDao) {
        this.UserDao = UserDao;
    }
}
  • 配置中使用property标签ref属性注入引用类型对象
<bean id="userDao" class="com.dcxuexi.dao.impl.UserDaoImpl" />
    
<bean id="userService" class="com.dcxuexi.service.impl.UserServiceImpl" >
    <property name="userDao" ref="userDao" />
</bean>

2. 环境准备

为了更好的学习下面内容,我们依旧准备一个新环境:

  • 创建一个Maven项目
  • pom.xml添加依赖
  • resources下添加spring的配置文件

项目的结构如下:

springboot的setter注入 spring setter注入_ci


(1)项目中添加UserDao、UserDaoImpl、CityDao、CityDaoImpl、UserService和UserServiceImpl类

public interface UserDao  {
    public void selectInfo();
}
public class UserDaoImpl implements UserDao {
    public void selectInfo() {
        System.out.println("UserDao selectInfo, running ,,,,,,,");
    }
}
public interface CityDao {
    public void fromCity();
}
public class CityDaoImpl implements CityDao {
    public void fromCity() {
        System.out.println("CityDao fromCity, running ......");
    }
}
public interface UserService {
    public void selectInfo();
}
public class UserServiceImpl implements UserService {

    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void selectInfo() {
        System.out.println("UserService selectInfo, running ......");
        userDao.selectInfo();
    }

}

(2)resources下提供spring的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="userDao" class="com.dcxuexi.dao.impl.UserDaoImpl" />

    <bean id="userService" class="com.dcxuexi.service.impl.UserServiceImpl" >
        <property name="userDao" ref="userDao" />
    </bean>

</beans>

(3)编写SpringSetter运行类,加载Spring的IOC容器,并从中获取对应的bean对象

public class SpringSetter {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = (UserService) context.getBean("userService");
        userService.selectInfo();
    }
}

接下来,在上面这个环境中来完成setter注入。

3. 注入引用数据类型

需求:在UserServiceImpl对象中注入cityDao

1.在UserServiceImpl中声明cityDao属性

2.为cityDao属性提供setter方法

3.在配置文件中使用property标签注入

步骤1:声明属性并提供setter方法

在UserServiceImpl中声明cityDao属性,并提供setter方法

public class UserServiceImpl implements UserService {

    private UserDao userDao;
    private CityDao cityDao;

    public void setCityDao(CityDao cityDao) {
        this.cityDao = cityDao;
    }

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void selectInfo() {
        System.out.println("UserService selectInfo, running ......");
        userDao.selectInfo();
        cityDao.fromCity();
    }

}

步骤2:配置文件中进行注入配置

在applicationContext.xml配置文件中使用property标签注入

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="userDao" class="com.dcxuexi.dao.impl.UserDaoImpl" />
    <bean id="cityDao" class="com.dcxuexi.dao.impl.CityDaoImpl" />

    <bean id="userService" class="com.dcxuexi.service.impl.UserServiceImpl" >
        <property name="userDao" ref="userDao" />
        <property name="cityDao" ref="cityDao" />
    </bean>

</beans>

步骤3:运行程序

运行SpringSetter类,查看结果,说明cityDao已经成功注入。

springboot的setter注入 spring setter注入_spring boot_02

4. 注入简单数据类型

需求:给UserDaoImpl注入一些简单数据类型的数据

参考引用数据类型的注入,我们可以推出具体的步骤为:

1.在UserDaoImpl类中声明对应的简单数据类型的属性

2.为这些属性提供对应的setter方法

3.在applicationContext.xml中配置

思考:
引用类型使用的是<property name="" ref=""/>,简单数据类型还是使用ref么?
ref是指向Spring的IOC容器中的另一个bean对象的,对于简单数据类型,没有对应的bean对象,该如何配置?

步骤1:声明属性并提供setter方法

在UserDaoImpl类中声明对应的简单数据类型的属性,并提供对应的setter方法

public class UserDaoImpl implements UserDao {

    private String userName;
    private Integer age;

    public void setUserName(String userName) {
        this.userName = userName;
    }

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

    public void selectInfo() {
        System.out.println("UserDao selectInfo, running ,,,,,,,");
        System.out.println("userName = " + userName + " ; age = " + age + " .");
    }
}

步骤2:配置文件中进行注入配置

在applicationContext.xml配置文件中使用property标签注入

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="userDao" class="com.dcxuexi.dao.impl.UserDaoImpl" >
        <property name="userName" value="xiaochuang" />
        <property name="age" value="20" />
    </bean>
    <bean id="cityDao" class="com.dcxuexi.dao.impl.CityDaoImpl" />

    <bean id="userService" class="com.dcxuexi.service.impl.UserServiceImpl" >
        <property name="userDao" ref="userDao" />
        <property name="cityDao" ref="cityDao" />
    </bean>

</beans>

说明:
value:后面跟的是简单数据类型,对于参数类型,Spring在注入的时候会自动转换,但是不能写成

<property name="age" value="temp" />

这样的话,spring在将temp转换成int类型的时候就会报错。

springboot的setter注入 spring setter注入_ci_03

步骤3:运行程序

运行SpringSetter类,查看结果,说明userDao已经成功注入。

springboot的setter注入 spring setter注入_ci_04


注意: 两个property注入标签的顺序可以任意。

对于setter注入方式的基本使用就已经介绍完了,

  • 对于引用数据类型使用的是<property name="" ref=""/>
  • 对于简单数据类型使用的是<property name="" value=""/>

项目代码