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方式(外部属性文件)
|
18天前
|
存储 缓存 Java
Spring面试必问:手写Spring IoC 循环依赖底层源码剖析
在Spring框架中,IoC(Inversion of Control,控制反转)是一个核心概念,它允许容器管理对象的生命周期和依赖关系。然而,在实际应用中,我们可能会遇到对象间的循环依赖问题。本文将深入探讨Spring如何解决IoC中的循环依赖问题,并通过手写源码的方式,让你对其底层原理有一个全新的认识。
39 2
|
1月前
|
XML 缓存 Java
搞透 IOC、Spring IOC ,看这篇就够了!
本文详细解析了Spring框架的核心内容——IOC(控制反转)及其依赖注入(DI)的实现原理,帮助读者理解如何通过IOC实现组件解耦,提高程序的灵活性和可维护性。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
|
3月前
|
XML Java 数据格式
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
Spring 第二节内容补充 关于Bean配置的更多内容和细节 万字详解!
250 18
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
|
3月前
|
XML Java 测试技术
spring复习01,IOC的思想和第一个spring程序helloWorld
Spring框架中IOC(控制反转)的思想和实现,通过一个简单的例子展示了如何通过IOC容器管理对象依赖,从而提高代码的灵活性和可维护性。
spring复习01,IOC的思想和第一个spring程序helloWorld
|
1月前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
40 0
|
2月前
|
Java Spring 容器
Spring IOC、AOP与事务管理底层原理及源码解析
【10月更文挑战第1天】Spring框架以其强大的控制反转(IOC)和面向切面编程(AOP)功能,成为Java企业级开发中的首选框架。本文将深入探讨Spring IOC和AOP的底层原理,并通过源码解析来揭示其实现机制。同时,我们还将探讨Spring事务管理的核心原理,并给出相应的源码示例。
146 9
|
2月前
|
存储 开发框架 Java
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
文章详细介绍了Spring、IOC、DI的概念和关系,解释了控制反转(IOC)和依赖注入(DI)的原理,并提供了IOC的代码示例,阐述了Spring框架作为IOC容器的应用。
38 0
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
|
3月前
|
缓存 Java Spring
手写Spring Ioc 循环依赖底层源码剖析
在Spring框架中,IoC(控制反转)是一个核心特性,它通过依赖注入(DI)实现了对象间的解耦。然而,在实际开发中,循环依赖是一个常见的问题。
46 4
|
2月前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
80 0