Spring注入

文章目录

    • 3.1 什么是注入
      • 3.1.1 为什么需要注入
      • 3.1.2 如何进行注入
      • 3.1.3 注入好处
    • 3.2 Spring 注入的原理分析(简易版)
    • 3.3 Set 注入详解
      • 3.3.1 JDK内置类型
      • 3.3.2 自定义类型
        • 3.3.2.1 第一种方式
        • 3.3.2.2 第二种方式
    • 3.4 构造注入
      • 3.4.1 步骤
      • 3.4.2 构造方法重载
    • 3.5 注入总结


在这里插入图片描述

3.1 什么是注入

注入(Injection)是指通过依赖注入(DI)方式,由容器动态地将某些对象的依赖关系注入到这些对象中。在Spring框架中,最常见的是通过构造函数setter 方法字段来进行依赖注入。

上面的文字太官方了,说的接地气点: 注入就是通过Spring⼯⼚及配置⽂件,为所创建对象的成员变量赋值.

3.1.1 为什么需要注入

通过编码的⽅式,为成员变量进⾏赋值,存在耦合,如下面这种方式:

stu.setId(1);
stu.setName("snow");

在 Spring 框架中,通过依赖注入,我们可以在配置文件或者通过注解的方式,明确地指定各个对象之间的依赖关系,然后由 Spring 容器来实现依赖的自动注入,从而简化了开发工作,提高了代码的可维护性和可扩展性。

3.1.2 如何进行注入

  1. 方式1:类的成员变量提供set get⽅法

  2. 方式2:配置spring的配置⽂件

<bean id="person" class="com.basic.Person"><property name="id"><value>10</value></property><property name="name"><value>露娜</value></property>
</bean>

3.1.3 注入好处

解耦合

依赖注入的优势在于,它使得对象的创建和依赖关系的管理不再由对象自身来完成,而是交由容器来完成。这样做的好处是降低了对象之间的耦合度,提高了代码的灵活性和可测试性,同时也使得代码更加清晰和易于维护。

在Spring框架中,通过依赖注入,我们可以在配置文件或者通过注解的方式,明确地指定各个对象之间的依赖关系,然后由Spring容器来实现依赖的自动注入,从而简化了开发工作,提高了代码的可维护性和可扩展性。


3.2 Spring 注入的原理分析(简易版)

Spring通过底层调⽤对象属性对应的 set ⽅法,完成成员变量的赋值,这种⽅式我们也称之为 set 注⼊ 。(这种方式底层是调用了对象的set方法,如果没有set方法是会报错的)

在这里插入图片描述


3.3 Set 注入详解

针对于不同类型的成员变量,在标签,需要嵌套其他标签

在这里插入图片描述

3.3.1 JDK内置类型

略…

3.3.2 自定义类型

3.3.2.1 第一种方式
  • 为成员变量提供set get⽅法
  • 配置⽂件中进⾏注⼊(赋值:将 userDAO 赋值给 UserServiceImpl)
<bean id="userService" class="xxxx.UserServiceImpl"><property name="userDAO"><bean class="xxx.UserDAOImpl"/></property>
</bean>
3.3.2.2 第二种方式
  1. 第一种方式存在的问题

    • 配置⽂件代码冗余
    • 被注⼊的对象(UserDAO),多次创建,浪费(JVM)内存资源
  2. 为成员变量提供set get⽅法

  3. 配置⽂件中进⾏配置

<bean id="userDAO" class="xxx.UserDAOImpl"/><bean id="userService" class="xxx.UserServiceImpl"><property name="userDAO"><ref bean="userDAO"/></property>
</bean>

3.4 构造注入

注⼊:通过Spring的配置⽂件,为成员变量赋值

Set注⼊:Spring调⽤Set⽅法 通过配置⽂件 为成员变量赋值

构造注⼊:Spring调⽤构造⽅法 通过配置⽂件 为成员变量赋值

3.4.1 步骤

  1. 提供有参构造⽅法

    public class Customer implements Serializable {private String name;private int age;public Customer(String name, int age) {this.name = name;this.age = age;}
    }
    
  2. Spring的配置⽂

<bean id="customer"class="com.snow.po.Customer"><constructor-arg><value>wang</value></constructor-arg><constructor-arg><value>20</value></constructor-arg>
</bean>

3.4.2 构造方法重载

  1. 参数个数不同

通过控制标签的数量进⾏区分

  1. 构造参数个数相同时

通过在标签引⼊ type属性 进⾏类型的区分


3.5 注入总结

依赖注入主要有以下几种类型:

构造函数注入:通过构造函数将依赖项注入到对象中。当创建对象时,容器会在构造对象时将依赖项作为参数传递给构造函数。

Setter 方法注入:通过调用对象的 Setter 方法来注入依赖项。在这种模式下,容器会通过调用对象的 Setter 方法来设置依赖项。

字段注入:通过直接设置对象的字段来注入依赖项。在这种模式下,容器会直接通过反射或其他方式将依赖项设置到对象的字段上。

依赖注入的优势在于,它使得对象的创建和依赖关系的管理不再由对象自身来完成,而是交由容器来完成。这样做的好处是降低了对象之间的耦合度,提高了代码的灵活性和可测试性,同时也使得代码更加清晰和易于维护。


实战中,应⽤set注⼊还是构造注⼊?

答案:set 注⼊更多

  1. 构造注⼊麻烦 (重载)
  2. Spring框架底层 ⼤量应⽤了 set注⼊

在这里插入图片描述



在这里插入图片描述



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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

洛谷 【算法1-6】二分查找与二分答案

【算法1-6】二分查找与二分答案 - 题单 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 鄙人不才&#xff0c;刷洛谷&#xff0c;迎蓝桥&#xff0c;【算法1-6】二分查找与二分答案 已刷&#xff0c;现将 AC 代码献上&#xff0c;望有助于各位 P2249 【深基13.例1】查找 - 洛谷…

Python中if __name__ == ‘__main__‘:的原理、作用和实践

Python中if name ‘main‘&#xff1a;的原理、作用和实践 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 &#x1f448; 希望得到您的…

Unity之PUN2插件实现多人联机射击游戏

目录 &#x1f4d6;一、准备工作 &#x1f4fa;二、UI界面处理 &#x1f4f1;2.1 登录UI并连接PUN2服务器 &#x1f4f1;2.2 游戏大厅界面UI &#x1f4f1;2.3 创建房间UI &#x1f4f1;2.4 进入房间UI &#x1f4f1;2.5 玩家准备状态 &#x1f4f1;2.6 加载战斗场景…

电子元件分销商

Top 10 Active Electronic Parts Distributors List – 2022 / 2023 一家从众多制造商那里收购所有电子元件并销售给客户的公司被称为电子元件分销商。 A company that acquires all electronic components from numerous manufacturers and sells them to customers from a si…

第十一天-Excel的操作

目录 1.xlrd-Excel的读模块 安装 使用 获取工作簿 读取工作簿的内容 xlsxwriter-Excel的写模块 安装 使用 生成图表 add_series参数 图表的样式 demo&#xff1a;生成图表 Excel的操作在python中有多个模块&#xff0c;为了能够快速使用&#xff0c;选择了相对简单…

【Java程序设计】【C00276】基于Springboot的就业信息管理系统(有论文)

基于Springboot的就业信息管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的就业信息管理系统 本系统分为前台功能模块、管理员功能模块、学生功能模块、企业功能模块以及导师功能模块。 前台功能模块&…

Threejs 实现3D影像地图,Json地图,地图下钻

1.使用threejs实现3D影像地图效果&#xff0c;整体效果看起来还可以&#xff0c;底层抽象了基类&#xff0c;实现了通用&#xff0c;对任意省份&#xff0c;城市都可以只替换数据&#xff0c;即可轻松实现效果。 效果如下&#xff1a; 链接https://www.bilibili.com/video/BV1…

HMI界面:是工业自动化的“窗口”,大有用武之地。

Hello&#xff0c;我是大千UI工场&#xff0c;本期分享HMI人机交互界面在工业自动化领域的应用&#xff0c;关注大千&#xff0c;学习N多UI干货&#xff0c;有设计需求&#xff0c;我们也可以接单。 HMI&#xff08;Human Machine Interface&#xff0c;人机界面&#xff09;在…

Redis篇之Redis持久化的实现

持久化即把数据保存到可以永久保存的存储设备当中&#xff08;磁盘&#xff09;。因为Redis是基于内存存储数据的&#xff0c;一旦redis实例当即数据将会全部丢失&#xff0c;所以需要有某些机制将内存中的数据持久化到磁盘以备发生宕机时能够进行恢复&#xff0c;这一过程就称…

Android LruCache源码分析

文章目录 Android LruCache源码分析概述LruCache和LinkedHashMap关系源码分析属性写入数据读取数据删除缓存 Android LruCache源码分析 概述 LruCache&#xff08;Least Recently Used Cache&#xff0c;最近最少使用缓存&#xff09;是 Android 中的一种缓存机制。 根据数据…

Nginx跳转模块之rewrite

一.location与rewrite模块的区别 rewrite&#xff1a;对访问的域名或者域名内的URL路径地址重写 location&#xff1a;对访问的路径做访问控制或者代理转发 二.rewrite模块基本内容 1.功能 通过正则表达式的匹配来改变URI&#xff0c;可以同时存在一个或多个指令&#xff0c…

SpringBoot3+Vue3 基础知识(持续更新中~)

bean 把方法的返回结果注入到ioc中 1: 2: 3: 组合注解封装 实战篇&#xff1a; 解析token&#xff1a; 统一携带token&#xff1a; 驼峰命名与下划线命名转换&#xff1a;