• 03 Spring_DI 依赖注入


    目录

    一、什么是依赖注入

    简单来说,控制反转是创建对象,依赖注入是为对象的属性赋值。

    二、DI_依赖注入三种方式

    1.Setter注入

    2.构造方法注入

    3.自动注入

    自动注入有两种配置方式:

    autowire的取值如下:

    测试自动注入:

    三、DI_依赖注入类型

    1.在被注入类中编写需要注入的属性名及类型

    2.测试方法

    3.在xml文件中编写注入代码

    (1)注入bean类型:private StudentDao studentDao;

    (2)注入基本数据类型:private String name; //字符串类型                                          private int count; //基本数据类型

    (3)注入List集合:private List names; // 字符串类型List集合                                 private List students1; // 对象类型List集合

    (4)注入Set集合:private Set students2; // 对象类型Set集合

    (5)注入Map集合:    private Map names2; //字符串类型Map集合                                     private Map students3;// 对象类型Map集合,student>,string>

    (6)注入Properties对象:private Properties properties;//Properties类型


    一、什么是依赖注入

     依赖注入(Dependency Injection,简称DI),它是Spring控制反转思想的具体实现。

    控制反转将对象的创建交给了 Spring ,但是对象中可能会依赖其他对象。比如service 类中要有 dao 类的属性,我们称 service 依赖于dao。之前需要手动注入属性值,代码如下:
    1. public interface StudentDao {
    2.   Student findById(int id);
    3. }
    1. public class StudentDaoImpl implements StudentDao{
    2.    @Override
    3.    public Student findById(int id) {
    4.        // 模拟根据id查询学生
    5.        return new Student(1,"百战程序员","北京");
    6.   }
    7. }
    1. public class StudentService {
    2. // service依赖dao,手动注入属性值,即手动维护依赖关系
    3.    private StudentDao studentDao = new StudentDaoImpl();
    4.    public Student findStudentById(int id){
    5.        return studentDao.findById(id);
    6.   }
    7. }
    此时,当 StudentService 的想要使用 StudentDao 的另一个实现类如StudentDaoImpl2时,则需要修改 Java 源码,造成代码的可维护性降低。
    而使用 Spring 框架后, Spring 管理 Service 对象与 Dao 对象,此时它能够为Service 对象注入依赖的 Dao 属性值。这就是 Spring 的依赖注入。

    简单来说,控制反转是创建对象,依赖注入是为对象的属性赋值。

    二、DI_依赖注入三种方式

     在之前的开发中,可以通过setter方法或构造方法设置对象的属性值,在Spring框架中,我们可以通过调用setter方法或构造方法给属性赋值。

    1.Setter注入

    (1)被注入类编写属性的setter方法:(setter注入需要在类中编写setter方法)

    1. public class StudentService {
    2.    private StudentDao studentDao;
    3.    public void setStudentDao(StudentDao studentDao) {
    4.        this.studentDao = studentDao;
    5.   }
    6. }

    (2)配置文件中,给需要注入属性值的中设置

    :配置对象          通过setter方法注入    通过构造器注入

    1. <bean id="studentDao" class="com.itbaizhan.dao.StudentDaoImpl">bean>
    2. <bean id="studentService" class="com.itbaizhan.service.StudentService">
    3. <property name="studentDao" ref="studentDao">property>
    4. bean>

    (3)测试是否注入成功

    1. public class TestContainer {
    2. @Test
    3. public void t1(){
    4. // 创建Spring容器
    5. ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
    6. // 从容器中获取对象
    7. StudentService studentService = (StudentService) ac.getBean("studentService");
    8. System.out.println(studentService);
    9. System.out.println(studentService.getStudentDao());
    10. System.out.println(studentService.findStudentById(1));
    11. }
    12. }

    (4)测试结果

    标明注入成功! 

    2.构造方法注入

    (1)被注入类编写有参的构造方法:(构造方法注入需要在类中编写构造方法)

    1. public class StudentService {
    2.    private StudentDao studentDao;
    3.    public StudentService(StudentDao studentDao) {
    4.        this.studentDao = studentDao;
    5.   }
    6. }

    (2)给需要注入属性值的中设置

    1. <bean id="studentDao" class="com.itbaizhan.dao.StudentDaoImpl">bean>
    2. <bean id="studentService" class="com.itbaizhan.service.StudentService">
    3. <constructor-arg name="studentDao" ref="studentDao">constructor-arg>
    4. bean>

    (3)测试是否注入成功、测试结果 如setter注入一样

    3.自动注入

     自动注入不需要在 标签中添加其他标签注入属性值,而是自动从容器中找到相应的bean对象设置为属性值。

    自动注入有两种配置方式:

    1.全局配置: 中设置 default - autowire 属性可以定义 所有 bean 对象的自动注入策略。(一般不使用)
    2.局部配置: 中设置 autowire 属性可以定义 当前 bean 对象的自动注入策略。(一般使用)

    autowire的取值如下:

    no 不会进行自动注入。
    default 全局配置 default 相当于 no ,局部配置 default 表示使用全局配置
    byName Spring 容器中查找 id 与属性名相同的 bean ,并进行注入。需要提供 set 方法。
    byType Spring 容器中查找类型与属性类型相同的 bean ,并进行注入。需要提供 set
    法。
    constructor Spring 容器中查找 id 与属性名相同的 bean ,并进行注入。需要提供构造方
    法。

    测试自动注入:

    1.为依赖的对象提供setter和构造方法

    1. public class StudentService {
    2.    // 依赖
    3. private StudentDao studentDao;
    4.    // 构造方法
    5.    public StudentService() {
    6.   }
    7.    
    8.    public StudentService(StudentDao studentDao) {
    9.        this.studentDao = studentDao;
    10.   }
    11.    // setter方法
    12.    public void setStudentDao(StudentDao studentDao) {
    13.        this.studentDao = studentDao;
    14.   }
    15.    // 调用依赖的方法
    16.    public Student findStudentById(int id) {
    17.        return studentDao.findById(id);
    18.   }
    19. }

    2.配置自动注入:

    (1)配置局部自动注入

    1. <bean id="studentDao" class="com.itbaizhan.dao.StudentDaoImpl">bean>
    2. <bean id="studentService" class="com.itbaizhan.service.StudentService" autowire="byName">bean>
    1. <bean id="studentDao" class="com.itbaizhan.dao.StudentDaoImpl">bean>
    2. <bean id="studentService"class="com.itbaizhan.service.StudentService" autowire="byType">bean>
    1. <bean id="studentDao" class="com.itbaizhan.dao.StudentDaoImpl">bean>
    2. <bean id="studentService"class="com.itbaizhan.service.StudentService" autowire="constructor">bean>

    (2)配置全局自动注入

    1. <beans xmlns="http://www.springframework.org/schema/beans"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://www.springframework.org/schema/beans
    4. http://www.springframework.org/schema/beans/spring-beans.xsd"
    5. default-autowire="constructor">

    三、DI_依赖注入类型

     DI支持注入bean类型、基本数据类型和字符串、List集合、Set集合、Map集合、Properties对象类型等,他们的写法如下:

    1.在被注入类中编写需要注入的属性名及类型

    1. public class StudentService {
    2. private StudentDao studentDao;//bean类型
    3. private String name; //字符串类型
    4. private int count; //基本数据类型
    5. private List names; // 字符串类型List集合
    6. private List students1; // 对象类型List集合
    7. private Set students2; // 对象类型Set集合
    8. private Map names2; //字符串类型Map集合
    9. private Map students3;// 对象类型Map集合
    10. private Properties properties;//Properties类型
    11.  // 省略getter/setter/toString
    12. }

    2.测试方法

    1. @Test
    2. public void t3(){
    3. ApplicationContext ac = new ClassPathXmlApplicationContext("bean1.xml");
    4. StudentService studentService = (StudentService)ac.getBean("studentService");
    5. System.out.println(studentService);
    6. }

    3.在xml文件中编写注入代码

    (1)注入bean类型:private StudentDao studentDao;

    写法一:

    1. <bean id="studentDao" class="com.itbaizhan.dao.StudentDaoImpl">bean>
    2. <bean id="studentService" class="com.itbaizhan.service.StudentService">
    3. <property name="studentDao" ref="studentDao">property>
    4. bean>

    写法二:

    1. <bean id="studentDao" class="com.itbaizhan.dao.StudentDaoImpl">bean>
    2. <bean id="studentService" class="com.itbaizhan.service.StudentService">
    3. <property name="studentDao">
    4. <ref bean="studentDao">ref>
    5. property>
    6. bean>

    (2)注入基本数据类型:private String name; //字符串类型
                                              private int count; //基本数据类型

    1. <bean id="studentService" class="com.itbaizhan.service.StudentService">
    2. <property name="name" value="写法">property>
    3. <property name="count">
    4. <value>10value>
    5. property>
    6. bean>

    (3)注入List集合:private List names; // 字符串类型List集合
                                     private List students1; // 对象类型List集合

    注入简单数据类型List集合:private List names;

    1. <bean id="studentService" class="com.itbaizhan.service.StudentService">
    2. <property name="name" value="写法">property>
    3. <property name="count">
    4. <value>10value>
    5. property>
    6. bean>

    注入对象类型List集合:private List students1; 

    1. <bean id="studentService" class="com.itbaizhan.service.StudentService">
    2. <property name="students1">
    3. <list>
    4. <bean class="com.itbaizhan.domain.Student">
    5. <property name="id" value="1">property>
    6. <property name="name" value="程序员1">property>
    7. <property name="address" value="北京">property>
    8. bean>
    9. <bean class="com.itbaizhan.domain.Student">
    10. <property name="id" value="2">property>
    11. <property name="name" value="程序员2">property>
    12. <property name="address" value="上海">property>
    13. bean>
    14. list>
    15. property>
    16. bean>

    (4)注入Set集合:private Set students2; // 对象类型Set集合

    注入Set集合和List集合大体一样,只是把标签换成标签

    1. <bean id="studentService" class="com.itbaizhan.service.StudentService">
    2. <property name="students2">
    3. <set>
    4. <bean class="com.itbaizhan.domain.Student">
    5. <property name="id" value="3">property>
    6. <property name="name" value="程序员3">property>
    7. <property name="address" value="北京">property>
    8. bean>
    9. <bean class="com.itbaizhan.domain.Student">
    10. <property name="id" value="4">property>
    11. <property name="name" value="程序员4">property>
    12. <property name="address" value="上海">property>
    13. bean>
    14. set>
    15. property>
    16. bean>

    (5)注入Map集合:private Map names2; //字符串类型Map集合
                                     private Map students3;// 对象类型Map集合

    注入简单数据类型Map集合:private Map names2;

    1. <bean id="studentService" class="com.itbaizhan.service.StudentService">
    2. <property name="names2">
    3. <map>
    4. <entry key="student1" value="bz">entry>
    5. <entry key="student2" value="sxt">entry>
    6. map>
    7. property>
    8. bean>

    注入对象数据类型Map集合: private Map students3;

    1. <bean id="studentService" class="com.itbaizhan.service.StudentService">
    2. <property name="students3">
    3. <map>
    4. <entry key="student1" value-ref="s1">entry>
    5. <entry key="student2" value-ref="s2">entry>
    6. map>
    7. property>
    8. bean>
    9. <bean id="s1" class="com.itbaizhan.domain.Student">
    10. <property name="id" value="1">property>
    11. <property name="name" value="bz">property>
    12. <property name="address" value="北极">property>
    13. bean>
    14. <bean id="s2" class="com.itbaizhan.domain.Student">
    15. <property name="id" value="2">property>
    16. <property name="name" value="sxt">property>
    17. <property name="address" value="上海">property>
    18. bean>

    (6)注入Properties对象:private Properties properties;//Properties类型

    1. <bean id="studentService" class="com.itbaizhan.service.StudentService">
    2. <property name="properties">
    3. <props>
    4. <prop key="配置1">值1prop>
    5. <prop key="配置2">值2prop>
    6. props>
    7. property>
    8. bean>
  • 相关阅读:
    进入vue之前需要了解的打包工具
    cuda编程之共享内存的bank冲突
    几种预训练模型微调方法和peft包的使用介绍
    工作流之Flowable与SpringBoot结合
    ETCD数据库源码分析——集群通信初始化
    uniapp微信小程序《隐私保护协议》弹窗处理流程
    机器学习笔记——欠拟合、过拟合
    雪地脚印 & 体积云
    Everything 一款功能强大的搜索工具
    【步骤详解】Docker一键部署微服务详细教程
  • 原文地址:https://blog.csdn.net/m0_51697147/article/details/126058975