三、DI 依赖注入学习总结

news2024/12/26 13:52:09

文章目录

  • 一、依赖注入
    • 1.1 构造函数注入
    • 1.2 Setter 方法注入(重点掌握)
      • 1.2.1 通过 Set 注入复杂类型和集合类型数据



一、依赖注入



        依赖注入(Dependency Injection,DI)是 Spring 框架的核心特性之一,也是 Spring 实现控制反转(Inversion of Control,IoC)的重要手段。
       依赖注入可以帮助我们解耦应用程序中的各个组件,使得这些组件可以更加灵活地组合和重用。


       要理解什么是依赖注入,就要先知道什么是依赖。依赖就是当我们创建了两个类,A类和B类,当我们在A类中创建了B类的实例,也就是在A类中 new B类的对象了。因为A类是要使用B类中的某些属性,所以这时候A类就依赖与B类。但是这种写法的耦合性十分严重,因为如果B类中的属性发生变化,那么引用B类实例的A类也会受到影响,所以出现了IoC容器,将实例的创建与管理交给Spring IoC容器,在通过依赖注入来实现控制反转,达到解耦的目的。
  • 依赖注入可以注入的类型

    • 基本类型和String字符串

    • 其他 bean类型(在配置文件中或者注解配置过的bean)。

    • 复杂类型/集合类型。



  • 实现依赖注入的方式: 在JDK5.0之前,实现依赖注入的方式有构造函数注入、Setter 方法注入。下面是通过 Char GPT 查询的依赖注入的注入方式相关文档

           在 Spring 框架中,可以通过构造函数注入和 Setter 方法注入来实现依赖注入,并通过 XML 配置文件或注解的方式来配置依赖关系。

            构造函数注入:构造函数注入是一种最常见的依赖注入方式。在构造函数注入中,我们通过构造函数将依赖关系注入到目标对象中。例如,我们可以在构造函数中声明一个接口类型的参数,然后在 Spring 容器中配置该接口的具体实现类,Spring 容器会自动将该实现类注入到构造函数中。
            Setter 方法注入:Setter 方法注入是另一种常见的依赖注入方式。在 Setter 方法注入中,我们通过 Setter 方法将依赖关系注入到目标对象中。例如,我们可以在目标对象中声明一个接口类型的属性,并提供一个 Setter 方法,然后在 Spring 容器中配置该接口的具体实现类,Spring 容器会自动调用 Setter 方法,将该实现类注入到目标对象中。

           无论是构造函数注入还是 Setter 方法注入,Spring 框架都可以通过 XML 配置文件或注解的方式来实现依赖注入。在 XML 配置文件中,我们可以通过 标签来声明目标对象和依赖关系,并通过 ref 属性来指定依赖关系的具体实现类。



1.1 构造函数注入


  • 使用构造函数注入: 当我们通过配置文件配置指定的类时,也就是Bean,Spring 会找到该类的构造方法,通过构造方法给成员变量赋值,这个注入过程完全由 Spring控制。

    • 代码实例:实例一:二、Spring 控制反转(IOC)学习总结中4.4章节

      • 实例二:创建一个子模块,在子模块中创建 User 实体类,不添加Set、get方法,创建有参构造和toString()

        	public class User {
        	    private String str;
        	    private String age;
        	    private String name;
        	    
        	    public User(String name,String str,String age){
        	        this.name = name;
        	        this.str = str;
        	        this.age = age;
        	    }
        	    public void show(){
        	        System.out.println("name:" + name);
        	        System.out.println("age:" + age);
        	        System.out.println("str:" + str);
        	    }
        	}
        
      • 创建 Beans.xml

        		<?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
        		        https://www.springframework.org/schema/beans/spring-beans.xsd">
        		
        		    <bean id="user" class="com.sys.dto.User">
        		        <constructor-arg index="1" value="在慵懒的生活中学习Java"/>
        		        <constructor-arg name="name" value="姚青"/>
        		        <constructor-arg type="java.lang.String" value="24"/>
        		    </bean>
        		
        		</beans>
        
      • 创建 MyTest

        	public class MyTest {
        	    public static void main(String[] args) {
        	        ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
        	        User user = (User) context.getBean("user");
        	        user.show();
        	    }
        	}
        
      • 运行结果
        在这里插入图片描述





1.2 Setter 方法注入(重点掌握)


  • 使用 Setter 方法注入: 通过反射调用set ()进行注入,所以要注入的实体类属性要有相对应的set方法

    • 依赖注入本质上就是Set注入,底层是通过Set()来实现的。

      • 依赖:bean对象的创建依赖于容器!

      • 注入:bean对象中的所有属性,由容器来注入!





1.2.1 通过 Set 注入复杂类型和集合类型数据



  • ref 标签: 对应ref属性,该标签name属性的属性值为另一个bean标签id或name属性的属性值;

  • array 标签: 为数组类型参数赋值;

  • value 标签: 对应value属性,用于设置基本数据类型或String类型的参数值;

  • list 标签: 为数组或List类型的参数赋值

  • set 标签: 为Set集合类型参数赋值

  • map 标签: 为Map集合类型参数赋值

  • props 标签: 为Properties类型的参数赋值



  • 通过 Set 注入复杂类型和集合类型数据

    • 创建一个子模块,与子模块中创建对应路径,创建 UserInfo 实体类

      public class UserInfo {
      
          // 使用Set注入的方式对各种类型数据进行注入
          private String name;// 字符串
          private Address address;// 引用类型
          private String[] books;// 数组类型
          private List<String> hobbys; // List 集合类型
          private Map<String, String> card;// Map 集合类型
          private Set<String> games;// Set 集合类型
          private String wife;
          private Properties info;// 引用类型
      
          public String getName() {return name;}
      
          public void setName(String name) {this.name = name;}
      
          public Address getAddress() {return address; }
      
          public void setAddress(Address address) {this.address = address;}
      
          public String[] getBooks() {return books;}
      
          public void setBooks(String[] books) {this.books = books;}
      
          public List<String> getHobbys() {return hobbys;}
      
          public void setHobbys(List<String> hobbys) {this.hobbys = hobbys;}
      
          public Map<String, String> getCard() {return card;}
      
          public void setCard(Map<String, String> card) {this.card = card;}
      
          public Set<String> getGames() {return games;}
      
          public void setGames(Set<String> games) {this.games = games;}
      
          public String getWife() {return wife;}
      
          public void setWife(String wife) {this.wife = wife; }
      
          public Properties getInfo() {return info;}
      
          public void setInfo(Properties info) {this.info = info; }
      
          @Override
          public String toString() {
              return "Student{" +
                      "name='" + name + '\'' +
                      ", address=" + address +
                      ", books=" + Arrays.toString(books) +
                      ", hobbys=" + hobbys +
                      ", card=" + card +
                      ", games=" + games +
                      ", wife='" + wife + '\'' +
                      ", info=" + info +
                      '}';
          }
      }
      
    • 创建 Address 实体类

      public class Address {
      
          private String address;
      
          public String getAddress() {return address;}
      
          public void setAddress(String address) {this.address = address;}
      }
      
    • 创建 Beans.xml

      <?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
              https://www.springframework.org/schema/beans/spring-beans.xsd">
      
          <bean id="address" class="com.sys.dto.Address">
              <property name="address" value="该用户来自外太空"/>
          </bean>
      
          <!-- 使用 Set注入复杂类型和集合类型数据 -->
          <bean id="userInfo" class="com.sys.dto.UserInfo">
              
              <!-- 第一种:字符串注入,直接用value注入 -->
              <property name="name" value="姚青"/>
              
              <!-- 第二种:注入引用类型数据,使用ref来注入 -->
              <property name="address" ref="address"/>
              
              <!-- 第三种:注入数组类型数据 -->
              <property name="learnContent">
                  <array>
                      <!-- 注:value注入的数据类型与实体类属性类型一致 -->
                      <value>JAVA</value>
                      <value>Mysql</value>
                      <value>Spring</value>
                      <value>Vue</value>
                  </array>
              </property>
              
              <!-- 第四种:注入 List 集合类型数据 -->
              <property name="hobbys">
                  <list>
                      <value>打游戏</value>
                      <value>在森林公园散步</value>
                      <value>躺在雪地里看天</value>
                  </list>
              </property>
      
              <!-- 第五种:注入Set 集合类型数据 -->
              <property name="games">
                  <set>
                      <value>王者荣耀</value>
                      <value>口袋妖怪</value>
                  </set>
              </property>
      
              <!-- 第六种:注入Map 集合类型数据 -->
              <property name="card">
                  <map>
                      <entry key="education" value="本科"/>
                      <entry key="age" value="24"/>
                  </map>
              </property>
      
              <!-- 第七种:注入 为 NULL 的数据 -->
              <property name="wife">
                  <null/>
              </property>
      
              <!-- 第八种:注入 Properties 类型数据 -->
              <property name="info">
                  <props>
                      <prop key="blogType">CSDN</prop>
                      <prop key="blogUrl">https://blog.csdn.net/shiyu_951/article/details/123269378</prop>
                  </props>
              </property>
          </bean>
      </beans>
      
    • 创建 SetterMyTest 测试类

      public class SetterMyTest {
          public static void main(String[] args) {
              ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
              UserInfo student = (UserInfo) context.getBean("userInfo");
              System.out.println("姓名:" + student.getName());
              System.out.println("住址:" + student.getAddress().getAddress());
              System.out.println("学习内容:" + Arrays.toString(student.getLearnContent()));
              System.out.println("爱好:" + student.getHobbys());
              System.out.println("喜欢的游戏:" + student.getGames());
              System.out.println("身份信息:" + student.getCard());
              System.out.println("是否婚配:" + student.getWife());
              System.out.println("博客信息:" + student.getInfo());
          }
      }
      
    • 运行结果
      在这里插入图片描述

扩展

       Java Properties 是一种用于存储和读取配置文件的数据结构,它继承自 Hashtable 类,可以保存一些键值对的配置信息,例如数据库连接信息、系统参数等。
       Properties 对象中的键和值都是字符串类型的,它提供了一些方法来读取和设置键值对,比如 getProperty()、setProperty()、load()、store() 等方法。




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/658153.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python中如何输出换行符\n

Python中如何输出换行符\n 如果你是一个Python开发者&#xff0c;你可能已经熟悉了多个输出Python变量的方法。但是&#xff0c;当你需要输出换行符’\n’时&#xff0c;你可能会遇到一些问题。这篇文章将介绍在Python中输出换行符的几种方法&#xff0c;并且告诉你哪种方法是…

13.IOC容器

IOC容器 IOC&#xff1a;Inversion of Control&#xff0c;翻译过来是反转控制 IOC思想 获取资源的传统方式&#xff1a;在应用程序中的组件需要获取资源时&#xff0c;传统的方式是组件主动的从容器中获取所需要的资源&#xff0c;在这样的模式下开发人员往往需要知道在具体…

第12课【嵌入式常见存储器类型】ROM RAM 一次性 DDR双倍速率 Flash

目录 存储器易失性存储器RAMDRAMSDRAMDDR SDRAM SRAMDRAM/SRAM总结 非易失性存储器ROMMASK ROMOTPROMEPROMEEPROM FLASH 存储器 存储器是组成计算机的重要部分&#xff0c;它可以存储数据&#xff0c;能让计算机拥有“记忆”。目前根据断电后&#xff0c;存储的数据是否会丢失…

TiDB v7.1.0 版本 Resource Control体验

作者&#xff1a; Ming 原文来源&#xff1a; https://tidb.net/blog/8abfaa25 简介 近期迎来了 TiDB v7.1.0 版本&#xff0c;也是2023年首发的LTS&#xff08;Long-Term Support Release&#xff09;版本&#xff0c;相比于之前的 v6.5.0 LTS版本已经过去了很长时间&…

Android PagerSnapHelper改造RecyclerView为ViewPage,kotlin

Android PagerSnapHelper改造RecyclerView为ViewPage&#xff0c;kotlin <?xml version"1.0" encoding"utf-8"?> <androidx.recyclerview.widget.RecyclerView xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tool…

Spring Web vs Spring Webflux

当你需要构建Web应用程序时&#xff0c;Spring Web 和 Spring Webflux 是Spring生态系统中的两个框架&#xff0c;但它们之间有一些关键区别。 Spring Web 是一个传统的Web框架&#xff0c;它构建在Servlet API之上。它旨在处理阻塞式I/O&#xff0c;即线程在从数据库或其他服务…

CTFHub | 过滤cat

0x00 前言 CTFHub 专注网络安全、信息安全、白帽子技术的在线学习&#xff0c;实训平台。提供优质的赛事及学习服务&#xff0c;拥有完善的题目环境及配套 writeup &#xff0c;降低 CTF 学习入门门槛&#xff0c;快速帮助选手成长&#xff0c;跟随主流比赛潮流。 0x01 题目描述…

Springboot读取配置文件的方式以及多环境读取的方式

Springboot读取配置文件的方式以及多环境读取的方式 一.首先介绍一下读取配置文件中的值的方式1.Value注解2.ConfigurationProperties注解赋值3.使用 Environment 读取配置文件 多环境读取 在项目中我们可能需要灵活的配置一些参数&#xff0c;就会将这些参数写到yaml文件或者p…

C++技能系列 ( 4 ) - 深入理解C++临时对象【解析与提高性能手段】

系列文章目录 C技能系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 期待你的关注哦&#xff01;&#xff01;&#xff01; 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the future of dream w…

Ubuntu设置虚拟机共享目录/mnt/hgfs下无文件显示相关问题归纳

文章目录 问题一&#xff1a;/mnt目录下无hgfs文件夹问题二&#xff1a;/mnt/hgfs 文件夹为空 问题一&#xff1a;/mnt目录下无hgfs文件夹 问题背景&#xff1a; 在打开共享目录A的时候&#xff0c;突然改变共享目录&#xff0c;也就是从A改到了B&#xff0c;但是资源管理器还…

TiDB v7.1.0版本 相关(部署、在线扩容、数据迁移)测试

作者&#xff1a; tomxu 原文来源&#xff1a; https://tidb.net/blog/69083bca TiDB v7.1.0版本 相关&#xff08;部署、在线扩容、数据迁移&#xff09;测试 一、服务器信息参数 | 序号 | 服务器型号 | 主机名 | 配置 | | IP地址 | 用户名 | 密码 | | -- | --------- | …

chatgpt赋能python:Python怎么过滤异常值-降噪数据的利器

Python怎么过滤异常值 - 降噪数据的利器 什么是异常值 在数据分析和机器学习领域&#xff0c;我们常常需要对数据进行预处理&#xff0c;其中一个常见的问题就是异常值。也可以称为噪声数据或离群点&#xff0c;指数据集中与其他值相差较大的点。通常这些异常值出现的原因有很…

6.10 面向对象抽象

抽象类 1 概念 Java中可以定义被abstract关键字修饰的方法,这种方法只有声明,没有方法体,叫做抽象方法. Java中可以定义被abstract关键字修饰的类,被abstract关键字修饰的类叫做抽象类 如果一个类含有抽象方法,那么它一定是抽象类 抽象类中的方法实现交给子类来完成 2 抽象…

MsSqlServer配置管理器TCP/IP属性

TCP/IP 属性&#xff08;“IP 地址”选项卡&#xff09; 使用 “TCP/IP 属性&#xff08;‘IP 地址’选项卡&#xff09;” 对话框&#xff0c;可以配置特定 IP 地址的 TCP/IP 协议选项。 只有选中 “IP All” &#xff0c;才能一次配置所有地址的 “TCP 动态端口” 和 “TCP…

Linux学习[16]bash学习深入2---别名设置alias---history指令---环境配置相关

文章目录 前言1. alias2. history3. 环境配置相关总结 前言 linux学习15里面简单提了一下alias指令&#xff0c;就表明它是一个别名的作用&#xff0c;这节就展开来写一下。 同时上一节一笔带过的history指令&#xff0c;这一节也进行例子的演示记录。 最后是环境相关的配置&a…

高斯过程(Gaussian Process)回归预测,例子,代码及可视化展示

高斯过程指的是一组随机变量的集合&#xff0c;这个集合里面的任意有限个随机变量都服从联合正态分布。&#xff08;联合正态分布是指多个随机变量的联合分布满足正态分布。联合分布是指多个随机变量同时满足的概率分布&#xff0c;一个常见的例子是考虑两个随机变量&#xff1…

【2023年最新】提高分类模型指标的六大方案详解

文章目录 数据增强特征选择调整模型参数模型集成迁移学习模型解释完结 当今&#xff0c;机器学习模型得到了广泛的应用&#xff0c;其中分类模型是其中最常见和重要的一种。在实际应用中&#xff0c;如何提高分类模型的指标&#xff0c;使其在不同场景下表现更佳并且具有更好的…

【Web网页制作】影视主题网页制作web页面开发(附源码)

【写在前面】 其实之前我就写过一篇关于我的家乡的页面&#xff0c;也有不少网友和我私下反馈&#xff0c;让我多出一些关于页面制作的&#xff0c;于是乎我就今天晚上抽出点时间来整理一篇关于影视内容的web页面制作&#xff0c;希望能够得到大家的喜欢。 【涉及内容】 web网页…

什么是进程?程序又是什么?程序运行在操作系统来看是怎么做的?

相信很多人都看到过课本上写的进程的概念&#xff0c;那么真的理解了吗&#xff1f; 课本上是这样讲的&#xff0c;课本概念&#xff1a;程序的一个执行实例&#xff0c;正在执行的程序等。 那么进程到底是什么&#xff1f;我先把内核层面上的概念拿出来&#xff1a;内核观点&a…

【算法基础】基础算法

快速排序 模板题&#xff1a;785. 快速排序 - AcWing题库 思路&#xff1a; 定义一个x&#xff08;一般喜欢用中间的&#xff09;&#xff0c;我们快速排序&#xff0c;让x左边的都比它小&#xff0c;同时让右边的都比它大。然后像二分一样不断细分&#xff0c;缩小范围进行同…