深入理解Spring IOC

这篇具有很好参考价值的文章主要介绍了深入理解Spring IOC。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🎉欢迎来到
Spring
专栏:深入理解Spring IOC

📜其他专栏:java面试 数据结构 源码解读 故障分析 系统设计


🎬作者简介:大家好,我是小徐🥇
☁️博客首页:CSDN主页小徐的博客
🌄每日一句:好学而不勤非真好学者

📜 欢迎大家关注! ❤️

1. IOC 理论

IOC 全称控制反转,英文名为 Inversion of Control,它还有一个别名为 DI(Dependency Injection),即依赖注入。

在我们刚接触Spring的时候,我们就听说了IOC,但是对于IOC的理解,貌似有些苦难。

我们对他的理解可能都是停留在以下内容:

就是一个类的实例化过程本来应由有我们自己控制new的过程,现在我们可以把控制权交给Spring框架来处理实例化对象。(获得对象的方式反转了)

降低程序间的耦合(依赖关系)

从字面看上去很简单,“控制”AND “反转”。但是我们如何理解“控制反转”呢?

那么我们就应该弄清以下四个问题:

  1. 谁控制谁
  2. 控制什么
  3. 为何是反转
  4. 哪些方面反转了

   深入理解Spring IOC,Spring,spring,java,后端

在回答这四个问题之前,我们先看 IOC 的定义:

所谓 IOC ,就是由 Spring IOC 容器来负责对象的生命周期和对象之间的关系

上面这句话是整个 IOC 理论的核心。如何来理解这句话?我们引用一个例子来走阐述(看完该例子上面四个问题也就不是问题了)。

找女朋友,一般情况下我们是如何来找女朋友的呢?首先我们需要根据自己的需求(漂亮、身材好、性格好)找一个妹子(喜欢吃软饭也可能是有钱阿姨啥的),然后到处打听她的兴趣爱好、微信、电话号码,然后各种投其所好送其所要,最后追到手。如下:

/**
 * 年轻小伙子
 */
public class YoungMan {

    private BeautifulGirl beautifulGirl;

    YoungMan(){

        // 可能你比较牛逼哈,指腹为婚

        // beautifulGirl = new BeautifulGirl();

    }

    public void setBeautifulGirl(BeautifulGirl beautifulGirl) {

        this.beautifulGirl = beautifulGirl;

    }

    public static void main(String[] args){

        YoungMan you = new YoungMan();

        BeautifulGirl beautifulGirl = new BeautifulGirl("你的各种条件");

        beautifulGirl.setxxx("各种投其所好");

        // 然后你有女票了,真厉害

        you.setBeautifulGirl(beautifulGirl);

    }

}

这就是我们通常做事的方式,如果我们需要某个对象,一般都是采用这种直接创建的方式(new BeautifulGirl()),这个过程复杂而又繁琐,而且我们必须要面对每个环节,而且使用完成之后我们还要复杂销毁它,这种情况下我们的对象与它所依赖的对象耦合在一起。

其实我们需要思考一个问题?我们每次用到自己依赖的对象真的需要自己去创建吗?我们知道,我们依赖对象其实并不是依赖该对象本身,而是依赖它所提供的服务,只要在我们需要它的时候,它能够及时提供服务即可,至于它是我们主动去创建的还是别人送给我们的,其实并不是那么重要。再说了,相比于自己千辛万苦去创建它还要管理善后而言,直接有人送过来是不是显得更加好呢?

这个给我们送东西的“人” 就是 IOC ,在上面的例子中,它就相当于一个婚介公司,作为一个婚介公司它管理着很多男男女女的资料,当我们需要一个女朋友的时候,直接跟婚介公司提出我们的需求,婚介公司则会根据我们的需求提供一个妹子给我们,我们只需要负责谈恋爱,生猴子就行了。你看,这样是不是很简单明了。

诚然,作为婚介公司的 IOC 帮我们省略了找女朋友的繁杂过程,将原来的主动寻找变成了现在的被动接受,更加简洁轻便。你想啊,原来你还得鞍马前后,各种巴结,什么东西都需要自己去亲力亲为,现在好了,直接有人把现成的送过来,多么美妙的事情啊。所以,简单点说,IOC 的理念就是让别人为你服务,如下图(摘自Spring揭秘):

深入理解Spring IOC,Spring,spring,java,后端

在没有引入 IoC 的时候,被注入的对象直接依赖于被依赖的对象,有了 IOC 后,两者及其他们的关系都是通过 Ioc Service Provider 来统一管理维护的。被注入的对象需要什么,直接跟 IoC Service Provider 打声招呼,后者就会把相应的被依赖对象注入到被注入的对象中,从而达到 IOC Service Provider 为被注入对象服务的目的。所以 IOC 就是这么简单!原来是需要什么东西自己去拿,现在是需要什么东西让别人(IOC Service Provider)送过来

现在在看上面那四个问题,答案就显得非常明显了:

  1. 谁控制谁:在传统的开发模式下,我们都是采用直接 new 一个对象的方式来创建对象,也就是说你依赖的对象直接由你自己控制,但是有了 IOC 容器后,则直接由 IOC 容器来控制。所以“谁控制谁”,当然是 IOC 容器控制对象
  2. 控制什么:控制对象。
  3. 为何是反转:没有 IOC 的时候我们都是在自己对象中主动去创建被依赖的对象,这是正转。但是有了 IOC 后,所依赖的对象直接由 IOC 容器创建后注入到被注入的对象中,依赖的对象由原来的主动获取变成被动接受,所以是反转。
  4. 哪些方面反转了:所依赖对象的获取被反转了。

妹子有了,但是如何拥有妹子呢?这也是一门学问。

  1. 可能你比较牛逼,刚刚出生的时候就指腹为婚了。
  2. 大多数情况我们还是会考虑自己想要什么样的妹子,所以还是需要向婚介公司打招呼的。
  3. 还有一种情况就是,你根本就不知道自己想要什么样的妹子,直接跟婚介公司说,我就要一个这样的妹子。

1.1 注入形式

所以,IOC Service Provider 为被注入对象提供被依赖对象也有如下几种方式:构造方法注入、stter方法注入、接口注入。

① 构造器注入

构造器注入,顾名思义就是被注入的对象通过在其构造方法中声明依赖对象的参数列表,让外部知道它需要哪些依赖对象。

YoungMan(BeautifulGirl beautifulGirl) {
    this.beautifulGirl = beautifulGirl;
}

构造器注入方式比较直观,对象构造完毕后就可以直接使用,这就好比你出生你家里就给你指定了你媳妇。

② setter 方法注入

对于 JavaBean 对象而言,我们一般都是通过 getter 和 setter 方法来访问和设置对象的属性。所以,当前对象只需要为其所依赖的对象提供相对应的 setter 方法,就可以通过该方法将相应的依赖对象设置到被注入对象中。如下:

public class YoungMan {

    private BeautifulGirl beautifulGirl;

    public void setBeautifulGirl(BeautifulGirl beautifulGirl) {
        this.beautifulGirl = beautifulGirl;
    }

}

相比于构造器注入,setter 方式注入会显得比较宽松灵活些,它可以在任何时候进行注入(当然是在使用依赖对象之前),这就好比你可以先把自己想要的妹子想好了,然后再跟婚介公司打招呼,你可以要林志玲款式的,赵丽颖款式的,甚至凤姐哪款的,随意性较强。

③ 接口方式注入

接口方式注入显得比较霸道,因为它需要被依赖的对象实现不必要的接口,带有侵入性。一般都不推荐这种方式。

1.2 推荐文章

关于 IOC 理论部分,在这里就不在阐述,这里推荐几篇博客阅读:

  • 《谈谈对 Spring IoC 的理解》
  • 《Spring IoC 原理(看完后大家可以自己写一个spring)》

2. 各个组件

先看下图(摘自:系统设计深入理解Spring IOC,Spring,spring,java,后端

该图为 ClassPathXmlApplicationContext 的类继承体系结构,虽然只有一部分,但是它基本上包含了 IOC 体系中大部分的核心类和接口。

下面我们就针对这个图进行简单的拆分和补充说明

2.1 Resource 体系

org.springframework.core.io.Resource,对资源的抽象。它的每一个实现类都代表了一种资源的访问策略,如 ClassPathResource、RLResource、FileSystemResource 等。深入理解Spring IOC,Spring,spring,java,后端

2.2 ResourceLoader 体系

有了资源,就应该有资源加载,Spring 利用 org.springframework.core.io.ResourceLoader 来进行统一资源加载,类图如下:深入理解Spring IOC,Spring,spring,java,后端

2.3 BeanFactory 体系

org.springframework.beans.factory.BeanFactory,是一个非常纯粹的 bean 容器,它是 IOC 必备的数据结构,其中 BeanDefinition 是它的基本结构。BeanFactory 内部维护着一个BeanDefinition map ,并可根据 BeanDefinition 的描述进行 bean 的创建和管理。

深入理解Spring IOC,Spring,spring,java,后端

  • BeanFactory 有三个直接子类 ListableBeanFactory、HierarchicalBeanFactory 和 AutowireCapableBeanFactory 。
  • DefaultListableBeanFactory 为最终默认实现,它实现了所有接口。

2.4 BeanDefinition 体系

org.springframework.beans.factory.config.BeanDefinition ,用来描述 Spring 中的 Bean 对象。

深入理解Spring IOC,Spring,spring,java,后端

BeanDefinition 类图

2.5 BeanDefinitionReader 体系

org.springframework.beans.factory.support.BeanDefinitionReader 的作用是读取 Spring 的配置文件的内容,并将其转换成 IOC 容器内部的数据结构 :BeanDefinition 。

深入理解Spring IOC,Spring,spring,java,后端

2.6 ApplicationContext 体系

org.springframework.context.ApplicationContext ,这个就是大名鼎鼎的 Spring 容器,它叫做应用上下文,与我们应用息息相关。它继承 BeanFactory ,所以它是 BeanFactory 的扩展升级版,如果BeanFactory 是屌丝的话,那么 ApplicationContext 则是名副其实的高富帅。由于 ApplicationContext 的结构就决定了它与 BeanFactory 的不同,其主要区别有:

  1. 继承 org.springframework.context.MessageSource 接口,提供国际化的标准访问策略。
  2. 继承 org.springframework.context.ApplicationEventPublisher 接口,提供强大的事件机制。
  3. 扩展 ResourceLoader ,可以用来加载多种 Resource ,可以灵活访问不同的资源。
  4. 对 Web 应用的支持。深入理解Spring IOC,Spring,spring,java,后端

3.总结

我们在最开始学习 Spring 的时候,就接触 IOC 了,IOC是Spring相对比较核心的概念,本文上面五个体系可以说是 Spring IOC 中最核心的部分,只有深入理解了IOC,在我们阅读Spring源码的时候,我们才能够更更加清晰。

4.写在最后

此文章为作者学习Spring机制记录的笔记,其中会涉及到别人的文章内容以及书籍的内容,如有雷同纯属借鉴。同时由于知识面的能力问题,文章难免会有错误之处,在不断的改正,如有错误之处,还请各位大佬指正哦。


仅供参考,欢迎评论区留言,一起讨论~文章来源地址https://www.toymoban.com/news/detail-811813.html

到了这里,关于深入理解Spring IOC的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java学习】 Spring的基础理解 IOC、AOP以及事务

        官网: https://spring.io/projects/spring-framework#overview     官方下载工具: https://repo.spring.io/release/org/springframework/spring/     github下载: https://github.com/spring-projects/spring-framework     maven依赖: 1.spring全家桶的结构构图:              最下边的是测试单元   其中spring封装

    2024年02月09日
    浏览(29)
  • Spring-2-深入理解Spring 注解依赖注入(DI):简化Java应用程序开发

      掌握纯注解开发依赖注入(DI)模式 学习使用纯注解进行第三方Bean注入 问题导入 思考:如何使用注解方式将Bean对象注入到类中 1.1 使用@Autowired注解开启自动装配模式(按类型) 说明:不管是使用配置文件还是配置类,都必须进行对应的Spring注解包扫描才可以使用。@Autowired默

    2024年02月14日
    浏览(46)
  • Spring核心容器IOC案例讲解,带你理解IOC

    Universe Infinity inc. 什么是IOC容器,先把IOC给忽略到,其实就是个容器。 什么?容器又是个啥玩意?容器是用来放东西的东西啊。 各个领域都喜欢起一些专业术语,显得很高级。给你讲IOC是不是很高级,给你讲Map是不是就明白了。 bean对象最终存储在spring容器中,在spring源码底

    2024年01月24日
    浏览(28)
  • Spring-1-透彻理解Spring XML的Bean创建--IOC

    上一篇文章我们介绍了什么是Spring,以及Spring的一些核心概念,并且快速快发一个Spring项目,实现IOC和DI,今天具体来讲解IOC 能够说出IOC的基础配置和Bean作用域 了解Bean的生命周期 能够说出Bean的实例化方式 问题导入 问题1:在 bean 标签上如何配置别名? 问题2:Bean的默认作用

    2024年02月13日
    浏览(29)
  • Spring-1-深入理解Spring XML中的依赖注入(DI):简化Java应用程序开发

    前两篇文章我们介绍了什么是Spring,以及Spring的一些核心概念,并且快速快发一个Spring项目,以及详细讲解IOC,今天详细介绍一些DI(依赖注入) 能够配置setter方式注入属性值 能够配置构造方式注入属性值 能够理解什么是自动装配 思考:向一个类中传递数据的方式有几种?(给类

    2024年02月13日
    浏览(40)
  • 【Spring教程九】Spring框架实战:全面深入详解IOC/DI注解开发

    欢迎大家回到《 Java教程之Spring30天快速入门》,本教程所有示例均基于Maven实现,如果您对Maven还很陌生,请移步本人的博文《 如何在windows11下安装Maven并配置以及 IDEA配置Maven环境》,本文的上一篇为《 IOC/DI配置管理第三方bean 加载properties文件》。 Spring的IOC/DI对应的配置开

    2024年02月03日
    浏览(37)
  • “深入理解Spring Boot:构建高效、可扩展的Java应用程序“

    标题:深入理解Spring Boot:构建高效、可扩展的Java应用程序 摘要:Spring Boot是一个用于构建Java应用程序的开源框架,它提供了一种简单且高效的方式来创建独立的、生产级别的应用程序。本文将深入探讨Spring Boot的核心概念和特性,并通过示例代码展示如何使用Spring Boot构建

    2024年02月15日
    浏览(49)
  • 深入分析Spring的IoC容器:从底层源码探索

    前言: 博主在最近的几次面试中,大中小厂都问到了Spring的ioc容器相关问题,这块知识确实是面试中的重点内容,因此结合所看的书籍,在这篇文章中总结下。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读,感谢大佬的关注。 如果文章有什么需要改进的地方欢迎

    2024年02月12日
    浏览(40)
  • 什么是 AOP?对于 Spring IoC 和 AOP 的理解?

    AOP(Aspect-Oriented Programming) ,即 面向切面编程, 它与 OOP( ObjectOriented Programming, 面向对象编程) 相辅相成,提供了与OOP 不同的抽象软件结构的视角 在 OOP 中, 我们以 类(class) 作为我们的基本单元 而 AOP 中的基本单元是 Aspect(切面) IOC(Inverse of Control:控制反转) 是一种设计思想,

    2024年02月12日
    浏览(34)
  • 【Spring教程11】Spring框架实战:IOC/DI注解开发管理第三方bean的全面深入详解

    欢迎大家回到《 Java教程之Spring30天快速入门》,本教程所有示例均基于Maven实现,如果您对Maven还很陌生,请移步本人的博文《 如何在windows11下安装Maven并配置以及 IDEA配置Maven环境》,本文的上一篇为《 纯注解开发模式下的依赖注入和读取properties配置文件》 前面定义bean的时

    2024年02月04日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包