深入理解 Srping IOC

2024-04-25 10:36
文章标签 深入 理解 ioc srping

本文主要是介绍深入理解 Srping IOC,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

什么是 Spring IOC?

IOC 全称:Inversion of Control,翻译为中文就是控制反转,IOC 是一种设计思想,IOC 容器是 Spring 框架的核心,它通过控制和管理对象之间的依赖关系来实现依赖注入(Dependency Injection),依赖注入是 IOC 的具体实现方式,它通过将对象的依赖关系通过构造函数、setter 方法或字段注入到对象中,从而实现了对象之间的解耦和灵活性,所谓 IOC ,其实就是由 Spring IOC 容器来负责对象的生命周期和对象之间的关系。

控制反转之灵魂拷问

  • 谁控制谁:在传统开发模式下,我们需要什么对象就 new 什么对象,也就是说需要依赖的对象自己来创建,而使用了 Spring IOC 容器之后,对象的创建销毁则有 IOC 容器来控制 ,也就是说 IOC 容器控制了对象。
  • 控制了什么:IOC 容器控制了对象及生命周期。
  • 何为反转:反转就是由开发者去创建维护对象,反转为交给 Spring IOC 容器去维护对象,开发者维护对象是主动的,Spring IOC 容器去维护对象之后,再获取对象就是被动的了,由主动获取变为被动获取,也就是反转的由来。
  • 反转了什么:对象的获取反转了,依赖的对象由主动获取变为被动获取,IOC 容器来帮对象找相应的依赖对象并注入,而不是由对象主动去找。

方便更好的理解 IOC,用图例简单说明一下

传统开发模式,所需要的对象都是自己主动创建,然后自己代码显式注入的,如图所示:

在这里插入图片描述

使用了 Spring IOC 模式,不在需要主动去创建这些对象了,也不需要自己代码显式注入直接从容器中获取即可,如图所示:

在这里插入图片描述

什么是依赖注入(DI,Dependency Injection)?

Dependency Injection 翻译为中文就是依赖注入,前面我们说了依赖注入是 IOC 的具体实现方式,依赖注入用于实现类之间的解耦和依赖关系的管理,通过依赖关系将对象的创建和维护转移到 IOC 容器中进行,使得对象的使用者不需要关心对象的创建和维护,依赖注入并没有给系统带来更多的功能,只是为系统搭建了一个灵活和扩展的平台,有了依赖注入,我们只需要进行简单配置,就可以完成业务实现,提高了开发效率。

依赖注入(DI,Dependency Injection)之灵魂拷问

  • 谁依赖谁:因为应用程序不在关心对象的创建和维护,直接从 IOC 容器中获取对象,显然是应用程序依赖 IOC 容器。
  • 为什么要依赖:知道了谁依赖谁,也就知道了为什么要依赖,因为应用程序不在关注对象的创建和维护,而又要使用对象,IOC 容器中有维护好的对象,自然要依赖 IOC 容器来获取对象。
  • 谁注入谁:IOC 容器注入应用程序需要的对象。

依赖注入(DI,Dependency Injection)的方式?

  • 属性注入:一个注解搞定,写法简单,但是不能注入 final 修饰的属性,违反单一职责原则,也不能在其他容器中使用,只能用于 IOC 容器。
  • setter 注入:setter注入就是使用 Java 的 set 方法配合注解将 Bean 注入到当前类中,不能注入final修饰的对象,注入的对象可能会被修改(因为 set 方法可以被多次调用,有修改的风险,所以注入的对象就可能被修改),,,,,,,,。
  • 构造方法注入:利用构造方法将 Bean 注入到当前类中,构造方法注入如果类只有一个构造方法,可不不用加注解,是因为 Spring 在设计的时候,使用构造方法注入且只有一个构造方法,Spring 就会将对象注入到当前类中,给这个属性进行赋值,因此可以省略注解 @AutoWired。
  • 接口方式注入:接口方式注入不是太友好,因为它需要被依赖的对象实现不必要的接口,有很大的侵入性,一般不建议使用。

IOC容器的优点和缺点?

优点:

  • 解耦:通过 IOC 容器,我们可以不同组件之间的解耦,提高了应用程序的加灵活、可维护和可扩展。
  • 可配置:IOC 容器提供了一种统一的配置方式,可以更加方便地管理和配置应用程序中的各个组件。
  • 依赖注入:IOC 容器自动完成依赖注入,帮我们管理了对象的创建和维护及依赖关系,不需要应用程序去关心这些,简化了开发工作。
  • 延迟加载:IOC 容器可以根据需要延迟加载组件,减少应用程序的启动时间和内存消耗。

缺点:

  • 对象创建不可见:IOC 容器帮我们完成了对象的创建和维护,使的整个过程不可见。
  • 效率相对较低:IOC 底层是使用反射去创建对象的,在效率上会有所消耗。

总结:本文对 Srping IOC 的概念有了深入理解,知道了Srping IOC 到底帮我们做了什么,但是对 Srping IOC 的底层实现逻辑还没有进行剖析,后面会继续分析 Srping IOC 的底层实现机制,欢迎持续关注。

欢迎提出建议及对错误的地方指出纠正。

这篇关于深入理解 Srping IOC的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/934437

相关文章

深入解析Spring TransactionTemplate 高级用法(示例代码)

《深入解析SpringTransactionTemplate高级用法(示例代码)》TransactionTemplate是Spring框架中一个强大的工具,它允许开发者以编程方式控制事务,通过... 目录1. TransactionTemplate 的核心概念2. 核心接口和类3. TransactionT

深入理解Apache Airflow 调度器(最新推荐)

《深入理解ApacheAirflow调度器(最新推荐)》ApacheAirflow调度器是数据管道管理系统的关键组件,负责编排dag中任务的执行,通过理解调度器的角色和工作方式,正确配置调度器,并... 目录什么是Airflow 调度器?Airflow 调度器工作机制配置Airflow调度器调优及优化建议最

Spring IOC的三种实现方式详解

《SpringIOC的三种实现方式详解》:本文主要介绍SpringIOC的三种实现方式,在Spring框架中,IOC通过依赖注入来实现,而依赖注入主要有三种实现方式,构造器注入、Setter注入... 目录1. 构造器注入(Cons编程tructor Injection)2. Setter注入(Setter

Spring IOC控制反转的实现解析

《SpringIOC控制反转的实现解析》:本文主要介绍SpringIOC控制反转的实现,IOC是Spring的核心思想之一,它通过将对象的创建、依赖注入和生命周期管理交给容器来实现解耦,使开发者... 目录1. IOC的基本概念1.1 什么是IOC1.2 IOC与DI的关系2. IOC的设计目标3. IOC

Spring核心思想之浅谈IoC容器与依赖倒置(DI)

《Spring核心思想之浅谈IoC容器与依赖倒置(DI)》文章介绍了Spring的IoC和DI机制,以及MyBatis的动态代理,通过注解和反射,Spring能够自动管理对象的创建和依赖注入,而MyB... 目录一、控制反转 IoC二、依赖倒置 DI1. 详细概念2. Spring 中 DI 的实现原理三、

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06