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.mfbz.cn/a/405896.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RobotGPT:利用ChatGPT的机器人操作学习框架,三星电子研究院与张建伟院士、孙富春教授、方斌教授合作发表RAL论文

1 引言 大型语言模型&#xff08;LLMs&#xff09;在文本生成、翻译和代码合成方面展示了令人印象深刻的能力。最近的工作集中在将LLMs&#xff0c;特别是ChatGPT&#xff0c;整合到机器人技术中&#xff0c;用于任务如零次系统规划。尽管取得了进展&#xff0c;LLMs在机器人技…

第八篇【传奇开心果系列】python的文本和语音相互转换库技术点案例示例:Google Text-to-Speech虚拟现实(VR)沉浸式体验经典案例

传奇开心果博文系列 系列博文目录python的文本和语音相互转换库技术点案例示例系列 博文目录前言一、雏形示例代码二、扩展思路介绍三、虚拟导游示例代码四、交互式学习示例代码五、虚拟角色对话示例代码六、辅助用户界面示例代码七、实时语音交互示例代码八、多语言支持示例代…

大模型平民化技术之LORA

1. 引言 在这篇博文中&#xff0c; 我将向大家介绍LoRA技术背后的核心原理以及相应的代码实现。 LoRA 是 Low-Rank Adaptation 或 Low-Rank Adaptors 的首字母缩写词&#xff0c;它提供了一种高效且轻量级的方法&#xff0c;用于微调预先训练好的的大语言模型。这包括 BERT 和…

数据之巅:揭秘企业数据分析师如何成为企业的决策智囊

引言 在数字化浪潮中&#xff0c;企业数据分析师已成为企业决策的重要支撑。他们如同探险家&#xff0c;在数据的丛林中寻找着能够指引企业前行的宝贵信息。本文将深入剖析企业数据分析师的角色、挑战与成就&#xff0c;带你领略这个充满智慧与激情的职业风采。 一、从数字到智…

计算机毕业设计 基于SpringBoot的宠物商城网站系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

代理模式笔记

代理模式 代理模式代理模式的应用场景先理解什么是代理&#xff0c;再理解动静态举例举例所用代码 动静态的区别静态代理动态代理 动态代理的优点代理模式与装饰者模式的区别 代理模式 代理模式在设计模式中是7种结构型模式中的一种&#xff0c;而代理模式有分动态代理&#x…

WordPres Bricks Builder 前台RCE漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

<网络安全>《48 网络攻防专业课<第十四课 - 华为防火墙的使用(1)>

1 DHCP Snooping 概述 DHCP Snooping功能用于防止 1、DHCP Server仿冒者攻击&#xff1b; 2、中间人攻击与IP/MAC Spoofing攻击&#xff1b; 3、改变CHADDR值的DoS攻击。 1.2 DHCP Server 仿冒者攻击 1.3 中间人与IP/MAC Spoofing 攻击 1.4 改变CHADDR 值的DoS 攻击 CHADDR…

2024年数学建模美赛详细总结以及经验分享

前言&#xff1a; 本文记录与二零二四年二月六日&#xff0c;正好今天是数学建模结束&#xff0c;打算写篇文章记录一下整个过程&#xff0c;以及一些感受、还有经验分享。记录这个过程的原因就是我在赛前&#xff0c;在博客上找了很久&#xff0c;也没有像我这么类似记…

Gemma模型论文详解(附源码)

原文链接&#xff1a;Gemma模型论文详解&#xff08;附源码&#xff09; 1. 背景介绍 Gemma模型是在2023.2.21号Google新发布的大语言模型, Gemma复用了Gemini相同的技术(Gemini也是Google发布的多模态模型)&#xff0c;Gemma这次发布了了2B和7B两个版本的参数&#xff0c;不…

JAVA--File类与IO流

目录 1. java.io.File类的使用 1.1 概述 1.2 构造器 1.3 常用方法 1、获取文件和目录基本信息 2、列出目录的下一级 3、File类的重命名功能 4、判断功能的方法 5、创建、删除功能 2. IO流原理及流的分类 2.1 Java IO原理 2.2 流的分类 2.3 流的API 3. 节点流之一…

微服务学习

一、服务注册发现 服务注册就是维护一个登记簿&#xff0c;它管理系统内所有的服务地址。当新的服务启动后&#xff0c;它会向登记簿交待自己的地址信息。服务的依赖方直接向登记簿要Service Provider地址就行了。当下用于服务注册的工具非常多ZooKeeper&#xff0c;Consul&am…

Jetson Xavier NX 与笔记本网线连接 ,网络共享,ssh连接到vscode

Jetson Xavier NX 与笔记本网线连接 &#xff0c;网络共享&#xff0c;ssh连接到vscode Jetson Xavier NX桌面版需要连接显示屏、鼠标和键盘&#xff0c;操作起来并不方便&#xff0c;因此常常需要ssh远程连接到本地笔记本电脑&#xff0c;这里介绍一种连接方式&#xff0c;通过…

Linux实验记录:使用PXE+Kickstart无人值守安装服务

前言&#xff1a; 本文是一篇关于Linux系统初学者的实验记录。 参考书籍&#xff1a;《Linux就该这么学》 实验环境&#xff1a; VmwareWorkStation 17——虚拟机软件 RedHatEnterpriseLinux[RHEL]8——红帽操作系统 备注&#xff1a; 实际生产中安装操作系统的工作&…

论文笔记:利用词对比注意增强预训练汉字表征

整理了 ACL2020短文 Enhancing Pre-trained Chinese Character Representation with Word-aligned Att&#xff09;论文的阅读笔记 背景模型实验 论文地址&#xff1a;论文 背景 近年来&#xff0c;以 BERT 为代表的预训练模型在 NLP 领域取得取得了非常显著的效果。但是&…

谈谈对BFC的理解

文章目录 一、是什么二、触发条件三、应用场景防止margin重叠&#xff08;塌陷&#xff09;清除内部浮动自适应多栏布局小结 参考文献 一、是什么 我们在页面布局的时候&#xff0c;经常出现以下情况&#xff1a; 这个元素高度怎么没了&#xff1f;这两栏布局怎么没法自适应&…

28-k8s集群中-StatefulSets控制器(进阶知识)

一、statefullsets控制器概述 1&#xff0c;举例 假如&#xff0c;我们有一个deployment资源&#xff0c;创建了3个nginx的副本&#xff0c;对于nginx来讲&#xff0c;它是不区分启动或者关闭的先后顺序的&#xff0c;也就是“没有特殊状态”的一个服务&#xff0c;也成“无状…

一次有趣的nginx Tcp4层代理转发的试验

nginx主配置文件添加配置&#xff1a; stream {log_format proxy $remote_addr [$time_local] $protocol status:$status bytes_sent:$bytes_sent bytes_received:$bytes_received $session_time upstream_addr:"$upstream_addr" "$upstream_bytes_sent" …

React18源码: React调度中的3种优先级类型和Lane的位运算

优先级类型 React内部对于优先级的管理&#xff0c;贯穿运作流程的4个阶段&#xff08;从输入到输出&#xff09;&#xff0c;根据其功能的不同&#xff0c;可以分为3种类型&#xff1a; 1 &#xff09;fiber优先级(LanePriority) 位于 react-reconciler包&#xff0c;也就是L…

基于Java SSM框架实现网络作业提交与批改系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现网络作业提交与批改系统演示 摘要 随着互联网时代的到来&#xff0c;同时计算机网络技术高速发展&#xff0c;网络管理运用也变得越来越广泛。因此&#xff0c;建立一个B/S结构的网络作业提交与批改系统&#xff0c;会使网络作业提交与批改系统工作系统化…
最新文章