Java面试八股之详细阐述Spring的DI和IOC

  1. 详细阐述Spring的DI和IOC

Spring框架的两大核心特性之一就是控制反转(Inversion of Control, IoC),另一个密切相关的是依赖注入(Dependency Injection, DI)。这两个概念是Spring实现松耦合、可测试和可管理软件组件的关键机制。

控制反转(Inversion of Control, IoC)

概念: IoC是一种设计原则,它提倡将对象的创建、初始化、装配等工作从程序主体代码中抽离出来,交给一个专门的外部容器来管理。这种“控制”的反转体现在:

创建控制反转:传统的程序中,对象的创建通常由代码内部通过new关键字直接完成。而在IoC模式下,对象的创建不再由程序自身控制,而是由容器负责创建和管理对象的生命周期。

依赖控制反转:对象间的依赖关系原本是在代码内部硬编码的,IoC则将这种依赖关系的管理转移到了外部容器。容器负责解析依赖关系,并在运行时自动将依赖注入到所需对象中。

目的: IoC的主要目的是降低组件之间的耦合度,提高系统的灵活性和可维护性。具体体现在:

解耦:通过容器集中管理对象创建和依赖关系,对象无需关心其依赖对象的具体实现,只需关注接口契约,从而降低了对象间的耦合度。

可配置:对象的创建、初始化、依赖关系等可以通过配置文件(如XML、Java注解或Java配置类)来指定,使得系统行为可灵活调整而无需修改代码。

可测试:由于对象间的依赖关系由容器透明地注入,使得在单元测试中可以轻易替换依赖对象为模拟对象(Mock),便于进行独立测试。

可扩展:通过改变配置而非修改代码,可以轻易地添加、替换或移除组件,有利于系统的扩展和演化。

依赖注入(Dependency Injection, DI)

概念: DI是实现IoC的一种具体设计模式和编程技巧,是IoC原则在Spring框架中的主要实现方式。它指的是在运行时,由外部容器动态地将一个对象所依赖的其他对象(或称为依赖项)注入到该对象中。

分类: Spring框架支持多种依赖注入方式:

构造函数注入:通过构造函数传递依赖对象。容器在创建目标对象时,会调用带有相应参数的构造函数,将依赖对象作为参数传入。

 Setter方法注入:通过setter方法(或任意可写属性方法)注入依赖对象。容器在创建目标对象后,调用其setter方法设置依赖对象。

字段注入(也称直接字段注入):对于非final的类字段,容器可以直接设置其值来注入依赖对象。这种方式在Spring框架中较少推荐,因为不鼓励直接修改对象的字段,且不利于测试和理解依赖关系。

注解注入:使用Spring提供的注解(如@Autowired、@Value、@Inject等)来标识依赖关系,容器在解析注解后进行相应的依赖注入。

过程: 依赖注入的过程大致如下:

配置依赖:在Spring配置文件(XML、Java注解或Java配置类)中声明对象及其依赖关系。

创建对象:当应用程序请求某个对象时,Spring容器负责创建该对象(如果尚未创建)。

解析依赖:容器解析对象的依赖关系,查找并准备需要注入的依赖对象。

注入依赖:根据配置的注入方式(构造函数、setter方法或字段),容器将依赖对象注入到目标对象中。

优点: DI带来了诸多好处:

松耦合:对象无需了解其依赖对象的创建细节,仅需定义好依赖的接口或抽象类型,实现了“面向接口编程”,增强了系统的可解耦性。

易于测试:由于依赖关系是可配置的,可以轻易地替换为测试替身(如Mock对象),便于进行单元测试。

可配置性:依赖关系的变更无需修改代码,只需调整配置即可,增强了系统的灵活性和可维护性。

生命周期管理:容器负责管理对象的生命周期,可以统一进行初始化、清理等操作,简化了对象管理。

总结来说,IoC是一种设计思想,强调将对象的控制权交给外部容器,以实现松耦合和更好的可管理性。DI则是实现IoC的具体手段,通过将依赖对象从外部注入到所需对象中,消除了硬编码的依赖关系,提高了系统的可测试性和可维护性。Spring框架通过其IoC容器有效地实现了这两种机制,为构建复杂的企业级应用程序提供了强大的基础支持。

  如果大家需要视频版本的讲解,欢迎关注我的B站:

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

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

相关文章

JMeter:BeanShell到JSR223迁移中的注意事项

前言 在之前的文章JMeter:BeanShell向JSR223迁移过程遭遇的java标准库不可用问题-如何切换JDK版本中引用了一段使用BeanShell对入参进行加密的脚本,迁移到JSR223,虽然更换JDK后编译通过,看似也可以执行了,但是其实那段…

强化数字科技基石:深化基础理论研究

加强数字科技基础理论研究并增加对其的资金投入,对于推动科技进步、培养创新人才以及构建具有国际竞争力的科技创新体系都具有深远意义。同时为了加强数字科技基础理论研究并推动产业园的发展,我们可以从以下几个方面进行: 一、加强数字科技…

【vue前端项目实战案例】Vue3仿今日头条App

本文将开发一款仿“今日头条”的新闻App。该案例是基于 Vue3.0 Vue Router webpack TypeScript 等技术栈实现的一款新闻资讯类App,适合有一定Vue框架使用经验的开发者进行学习。 项目源码在文章末尾 1 项目概述 该项目是一款“今日头条”的新闻资讯App&#xf…

P6 优化篇 - 数据折线图可视化步骤

增加新页面, 则需要在 page.json里面增加页面信息 2.添加目录, 和路径 同时也要添加目录了 , 新建目录LineChart , 添加文件LineChart.vue 4.LineChart.vue 直接复制黏贴 <template><view class"container"><!-- 图表显示区域 --><view cla…

如何做校园圈子小程序,需要哪些功能?可打包APP小程序H5,源码交付,支持二开!

独立学校首页 支持每个学校独立首页!每个学校都可以拥有专属首页&#xff0c;打造不同风格的学校首页展示效果 多业务覆盖 可实现校园内外卖、跑腿、超市、药店水果、快餐店等业务全覆盖!所有配送业务平台都可开展 多站点运营 支持多学校多站点运营&#xff0c;各分站管理员可独…

Java面试八股之简述spring boot的目录结构

简述spring boot的目录结构 Spring Boot 项目遵循标准的 Maven 或 Gradle 项目布局&#xff0c;并且有一些约定的目录用于组织不同的项目组件。下面是一个典型的 Spring Boot 项目目录结构&#xff1a; src/main/java&#xff1a;包含所有的 Java 源代码&#xff0c;通常按包组…

【计算机毕业设计】基于微信小程序的传染病防控宣传系统【源码+lw+部署文档】

包含论文源码的压缩包较大&#xff0c;请私信或者加我的绿色小软件获取 免责声明&#xff1a;资料部分来源于合法的互联网渠道收集和整理&#xff0c;部分自己学习积累成果&#xff0c;供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者…

基于FPGA的YOLOV5s神经网络硬件部署

一 YOLOV5s 本设计以YOLOV5s部署于FPGA上为例进行分析概述。YOLOV5s网络主要包括backbone、neck、head三部分。 涉及的关键算子&#xff1a; Conv&#xff1a;卷积&#xff0c;包括3*3、1*1&#xff0c;stride1/2Concat&#xff1a;Upsample:Pooling&#xff1a;ADD 二 评估 …

大语言模型-GPT-Generative Pre-Training

一、背景信息&#xff1a; GPT是2018 年 6 月由OpenAI 提出的预训练语言模型。 GPT可以应用于复杂的NLP任务中&#xff0c;例如文章生成&#xff0c;代码生成&#xff0c;机器翻译&#xff0c;问答对话等。 GPT也采用两阶段的训练过程&#xff0c;第一阶段是无监督的方式来预训…

【数据结构】二叉树——顺序结构——堆及其实现

一、树 1.1、树的概念和结构 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限节点组成的一个具有层次关系的集合。 树有一个特殊的节点&#xff0c;称为根节点&#xff0c;根节点没有前驱结点。 除根节点外&#xff0c;其余部分被分为M&…

《0基础》学习Python——第十九讲__爬虫/<2>

一、用get请求爬取一般网页 首先由上节课我们可以找到URL、请求方式、User-Agent以及content-type 即&#xff1a;在所在浏览器页面按下F12键&#xff0c;之后点击网路-刷新&#xff0c;找到第一条双击打开标头即可查看上述所有内容&#xff0c;将上述URL、User-Agent所对应的…

【故障排除】Unity在编辑器模式下Play时闪退

一开始以为是偶然的情况&#xff0c;但逐渐发现了规律&#xff1a; 每次某个角色释放技能的时候就会闪退。 为了找到问题代码&#xff0c;找了一下存放运行Log的文件夹&#xff1a; 打开 Console 窗口&#xff08;菜单&#xff1a;Window > General > Console&#xff…

记事本案例组件版本(源码分享)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

axios请求大全

本文讲解axios封装方式以及针对各种后台接口的请求方式 axios的介绍和基础配置可以看这个文档: 起步 | Axios中文文档 | Axios中文网 axios的封装 axios封装的重点有三个&#xff0c;一是设置全局config,比如请求的基础路径&#xff0c;超时时间等&#xff0c;第二点是在每次…

蓝桥杯单片机学习总结(Day15 超声波测距)

开启超声波模块测距方法&#xff1a; X20106A是一款红外线检波接收的专用芯片&#xff0c;常用于电视机红外遥控接收器。当CX20106A接收到40KHz的信号时&#xff08;第五脚200K的电阻决定了其频率为40KHz&#xff09;&#xff0c;会在OUT脚输出一个低电平下降脉冲。这个信号甚至…

Ubuntu-文件管理器中鼠标右键添加文本文件

文件管理器中鼠标右键添加文本文件 一、概述二、步骤 一、概述 Ubuntu在文管右键发现没有创建文本文件的菜单&#xff0c; 期望如下所示&#xff0c;这样的操作非常简单 二、步骤 找到模板文件夹 在模板文件夹&#xff0c;创建自己想要的文件就好啦 这个也是支持放文件夹去…

PyTorch的模型定义方法

文章目录 1、简介2、导包3、设置属性4、构建数据集5、训练函数5.1、初始准备5.2、训练过程5.3、绘制图像 6、运行效果7、完整代码 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff0c;擅长we…

【图形图像-1】SDF

在图形图像处理中&#xff0c;SDF&#xff08;Signed Distance Field&#xff0c;带符号的距离场&#xff09;是一种表示图形轮廓和空间距离的数学结构。它通常用于计算机图形学、文本渲染、碰撞检测和物理模拟等领域。 SDF&#xff08;Signed Distance Field&#xff0c;带符号…

【数据结构】排序算法——Lesson2

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

算法力扣刷题记录 五十七【236. 二叉树的最近公共祖先】和【235. 二叉搜索树的最近公共祖先】

前言 公共祖先解决。二叉树和二叉搜索树条件下的最近公共祖先。 二叉树篇继续。 一、【236. 二叉树的最近公共祖先】题目阅读 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff…