首页 > 编程语言 >Java面试八股之详细阐述Spring的DI和IOC

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

时间:2024-07-23 16:57:40浏览次数:15  
标签:容器 依赖 Java DI 对象 Spring 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站:

标签:容器,依赖,Java,DI,对象,Spring,IoC,注入
From: https://blog.csdn.net/u012151345/article/details/140640601

相关文章

  • SpringBoot升级到3.3.2版本,JDK升级到17,引入Mybatis-plus后启动报错:Property 'sqlSessi
    【问题描述】2024-07-23T15:16:07.174+08:00WARN2604---[questionnaire][main]ConfigServletWebServerApplicationContext:Exceptionencounteredduringcontextinitialization-cancellingrefreshattempt:org.springframework.beans.factory.UnsatisfiedDependen......
  • Java并发编程
     目录 1、JUC并发编程2、线程池3、Executor接口 4、ExecutorServicw接口(1)语句:创建线程池(2)语句:调用线程:执行结果:​编辑 5、对比调用线程池和直接创建线程程序执行速度 6、插入知识点:输出系统时间/程序执行的时间1、JUC并发编程它是Java.util.concurrent......
  • Transformer-Embedding
    导包#导入包importtorchfromtorchimportnnimporttorch.nn.functionalasfimportmathTokenEmbedding#首先定义tokenembaddingfromtorchimportTensor"""将输入词汇表的索引转换成指定维度的Embedding"""classTokenEmbedding(nn.Embedding......
  • Condition
    Condition接口一共提供了以下7个方法:await():线程等待直到被通知或者中断。类似于Object.wait()。awaitUninterruptibly():线程等待直到被通知,即使在等待时被中断也不会返回。没有与之对应的Object方法。await(longtime,TimeUnitunit):线程等待指定的时间,或被通知,或被中......
  • [转]从SQLite到Redis:探索C++与多种数据库的交互之道
    转自:【C++风云录】从SQLite到Redis:探索C++与多种数据库的交互之道开启数据库之旅:通过C++与各种数据库交互,事半功倍1.SQLite1.1简介SQLite是一个嵌入式关系型数据库管理系统,提供了一个轻量级的C++接口。它是一个开源的软件库,无需配置服务器或安装管理工具,可以直接在程序中使......
  • Springboot整合WebSocket作为服务端遇到的坑
    最近遇到一个需求,对接某公有云上的坐席系统,需要接收人工坐席和客户对话的语音流,然后调用ASR(AutomaticSpeechRecognition,自动语音识别)引擎,对语音流实时转写,最后将实时转写的内容推送到kafka,供下游系统消费。大致流程图如下:标绿的系统即是我方需求对接系统。问题:上述前......
  • SpringBoot整合WebSocket实践
    简介先来看下维基百科WebSocket的简介:WebSocket是一种与HTTP不同的协议。两者都位于OSI模型的应用层,并且都依赖于传输层的TCP协议。虽然它们不同,但是RFC6455中规定:itisdesignedtoworkoverHTTPports80and443aswellastosupportHTTPproxiesandintermediaries......
  • Java入门基础-10面向对象高级
    Java入门基础-10面向对象高级本章知识点总结于黑马程序员的视频课程:《Java入门基础课程》,是对上课做的笔记Java入门基础课程视频地址上一章:Java入门基础-09综合案例ATM系统目录Java入门基础-10面向对象高级前言staticstatic修饰成员变量static修饰成员变量的应用场......
  • Java入门基础-09综合案例ATM系统
    Java入门基础-09综合案例ATM系统本章知识点总结于黑马程序员的视频课程:《Java入门基础课程》,是对上课做的笔记Java入门基础课程视频地址上一章:Java入门基础-08常用API目录Java入门基础-09综合案例ATM系统前言01系统构架搭建、欢迎页设计Account.javaATM.javaTest.......
  • Antd报错Cannot read properties of undefined (reading 'createElement')
    1、代码root=createRoot(document.getElementById("materialCertification"));root.render(<DisplayUI/>);2、报错信息logger.js:205Cannotreadpropertiesofundefined(reading'createElement')[email protected]:205_processError......