Spring IOC:IOC在Spring底层中如何实现?

简介: Spring IOC:IOC在Spring底层中如何实现?

编译软件:IntelliJ IDEA 2019.2.4 x64

操作系统:win10 x64 位 家庭版

Maven版本:apache-maven-3.6.3

Mybatis版本:3.5.6

spring版本:5.3.1

Spring系列专栏文章目录


一. 什么是IOC?

IOC,英文全称为Inversion of Control,意为反转控制。不是什么新的开发技术,而是一种开发设计思想

我们都知道在应用程序中的组件需要获取资源时,传统的方式是组件主动的从容器中获取所需要的资源,在这样的模式下开发人员往往需要知道在具体容器中特定资源的获取方式,增加了学习成本,同时降低了开发效率。

这里的组件是什么?

在Spring框架中,组件(Component)是指可以被Spring容器管理和配置的对象,包括Java类和Bean等。

反转控制的思想完全颠覆了上述的传统方式:即反转了资源的获取方向,变成容器主动的将资源推送给需要的组件开发人员不需要知道容器是如何创建资源对象的,只需要提供接收资源的方式即可,极大的降低了学习成本,提高了开发的效率。

例如,当我们突然想吃红烧狮子头这道菜,传统的方式是我们自己去菜市场买菜,购置并准备烹饪这道菜的原材料,调料与烹饪工具,自己动手做这道菜。而使用IOC的思想来看,就是我们去饭馆吃饭,点上红烧狮子头这道菜,让饭馆给我们做,我们不需要准备这道菜的原材料和做法。这有点类似面向对象的设计思想–“我不做,我让你去做”


二. IOC在spring中的实现

我们都知道spring框架中的核心部分是“IOC”思想,即控制反转。当应用程序启动时,spring容器会帮助开发者去创建相应的对象,注意是spring容器在创建对象,并将需要的依赖关系在运行时注入到对象中,这个依赖关系的注入过程就被称为依赖注入【DI】

那什么是依赖关系?

用通俗的话来说,就是“我需要你,所以我依赖于你,我和你是依赖关系;而你是独立的,可以不需要我”,比如,我们中国人吃饭,都是拿筷子夹菜,扒饭吃。在这一现象中,我们在吃饭的过程中需要用到筷子,我们依赖于筷子,而筷子不需要依赖谁。ok,我们和筷子构成了依赖关系。在Java程序中,可以这样设计,将我们中国人提取抽象为一个ChinesePerson类,筷子也抽象为chopsticks类,ChinesePerson类需要用到筷子,可以把chopsticks类【筷子】作为它的成员属性。

依赖注入,谁注入谁?注入了什么?

IOC容器会注入应用程序依赖的对象,注入依赖的对象它所需要的外部资源(包括对象、资源、常量数据),比如基于上面的案例情景中,IOC容器会在ChinesePerson类为它的成员属性注入它所依赖的对象,即chopsticks类的对象。

2.1 在spring底层中,IOC如何实现?

它主要通过BeanFactory和ApplicationContext两个接口来实现

2.1.1 BeanFactory与ApplicationContexet接口

  • BeanFactoryIOC容器的基本实现,是Spring内部的使用接口,它主要负责创建并管理bean对象,是面向Spring本身的,并不提供给开发人员 使用的
  • ApplicationContextBeanFactory的子接口,它提供了更多的高级特性支持,例如AOP与事务传递机制等等。它是面向Spring的使用者,几乎所有场合都能使用它

2.1.2 IOC类的图解

  • BeanFactory接口:Springl底层IOC实现【面向Spring框架】
  • ApplicationContext子接口:面向程序员
  • ConfigurableApplicationContext子接口:提供关闭或刷新容器对象方法
  • ClassPathXmlApplicationContext:基于类路径检索xml文件【推荐这种】
  • FileSystemXmlApplicationContext:基于文件系统检索xml文件
相关文章
|
4天前
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
|
2月前
|
XML Java 数据格式
Spring5系列学习文章分享---第一篇(概述+特点+IOC原理+IOC并操作之bean的XML管理操作)
Spring5系列学习文章分享---第一篇(概述+特点+IOC原理+IOC并操作之bean的XML管理操作)
33 1
|
2月前
|
XML druid Java
Spring5系列学习文章分享---第二篇(IOC的bean管理factory+Bean作用域与生命周期+自动装配+基于注解管理+外部属性管理之druid)
Spring5系列学习文章分享---第二篇(IOC的bean管理factory+Bean作用域与生命周期+自动装配+基于注解管理+外部属性管理之druid)
38 0
|
4天前
|
XML Java 数据格式
Spring5入门到实战------4、IOC容器-Bean管理XML方式、集合的注入(二)
这篇文章是Spring5框架的实战教程,主题是IOC容器中Bean的集合属性注入,通过XML配置方式。文章详细讲解了如何在Spring中注入数组、List、Map和Set类型的集合属性,并提供了相应的XML配置示例和Java类定义。此外,还介绍了如何在集合中注入对象类型值,以及如何使用Spring的util命名空间来实现集合的复用。最后,通过测试代码和结果展示了注入效果。
Spring5入门到实战------4、IOC容器-Bean管理XML方式、集合的注入(二)
|
4天前
|
XML Java 数据格式
Spring5入门到实战------6、IOC容器-Bean管理XML方式(自动装配)
这篇文章是Spring5框架的入门教程,详细讲解了IOC容器中Bean的自动装配机制,包括手动装配、`byName`和`byType`两种自动装配方式,并通过XML配置文件和Java代码示例展示了如何在Spring中实现自动装配。
Spring5入门到实战------6、IOC容器-Bean管理XML方式(自动装配)
|
4天前
|
XML Java 数据格式
Spring5入门到实战------5、IOC容器-Bean管理(三)
这篇文章深入探讨了Spring5框架中IOC容器的高级Bean管理,包括FactoryBean的使用、Bean作用域的设置、Bean生命周期的详细解释以及Bean后置处理器的实现和应用。
Spring5入门到实战------5、IOC容器-Bean管理(三)
|
4天前
|
XML Java 数据格式
Spring5入门到实战------3、IOC容器-Bean管理XML方式(一)
这篇文章详细介绍了Spring框架中IOC容器的Bean管理,特别是基于XML配置方式的实现。文章涵盖了Bean的定义、属性注入、使用set方法和构造函数注入,以及如何注入不同类型的属性,包括null值、特殊字符和外部bean。此外,还探讨了内部bean的概念及其与外部bean的比较,并提供了相应的示例代码和测试结果。
Spring5入门到实战------3、IOC容器-Bean管理XML方式(一)
|
4天前
|
XML Java 数据格式
Spring5入门到实战------2、IOC容器底层原理
这篇文章深入探讨了Spring5框架中的IOC容器,包括IOC的概念、底层原理、以及BeanFactory接口和ApplicationContext接口的介绍。文章通过图解和实例代码,解释了IOC如何通过工厂模式和反射机制实现对象的创建和管理,以及如何降低代码耦合度,提高开发效率。
Spring5入门到实战------2、IOC容器底层原理
|
4天前
|
XML Java 数据格式
Spring5入门到实战------8、IOC容器-Bean管理注解方式
这篇文章详细介绍了Spring5框架中使用注解进行Bean管理的方法,包括创建Bean的注解、自动装配和属性注入的注解,以及如何用配置类替代XML配置文件实现完全注解开发。
Spring5入门到实战------8、IOC容器-Bean管理注解方式
|
4天前
|
XML Java 数据格式
Spring5入门到实战------2、IOC容器底层原理
这篇文章深入探讨了Spring5框架中的IOC容器,包括IOC的概念、底层原理、以及BeanFactory接口和ApplicationContext接口的介绍。文章通过图解和实例代码,解释了IOC如何通过工厂模式和反射机制实现对象的创建和管理,以及如何降低代码耦合度,提高开发效率。
Spring5入门到实战------2、IOC容器底层原理