Spring容器 IoC思想 DI实现

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Spring容器 IoC思想 DI实现

Spring


Spring 指的是 Spring Framework ,翻译过来就是Spring框架。是一个支持广泛应用场景的开源框架。


而其功能可以用一句话总结:“Spring是包含了众多工具方法的Ioc的容器”


  • 容器:容器是 来容纳某种物品的(基本)装置 --- (百度百科)

  • Spring 是Web容器

  • List/Map 是数据存储容器

  • Spring是一个IoC容器

IoC


定义


全拼:Inversion of Control 翻译: "控制反转"

其实IoC是一种思想,一个重要的面向对象的法则,它能指导我们如何设计出松耦合,更优良的程序。


对IoC的代码理解


假设我们对一个物品进行包装 物品(外包装-->内包装--->产品)。他们之间具有 耦合关系


  1. 传统思想写这个代码,创建三个类


public class Product {
    int size;//物品的大小
    public Product(int size) {
        this.volume = size;
    }
}
----------------------------------------------------------
public class InnerPacking {
    int size;
    public InnerPacking(int size) {
        Product product = new Product(size);
    }
}
----------------------------------------------------------
public class OuterPacking {
    int size;
    //我自己造一个对象
    public OuterPacking(int size) {
        InnerPacking innerPacking = new InnerPacking(size);
    }
}
----------------------------------------------------------
//使用main方法 new 一个 拥有内外包装的物品
    public static void main(String[] args) {
        OuterPacking outerPacking = new OuterPacking(10);
    }
  1. 使用IoC思想 去解决这个问题
public class Product {
    int size;//物品的大小
    public Product(int size) {
        this.size = size;
        System.out.println("Product完成");
    }
}
----------------------------------------------------------
public class InnerPacking {
    Product product;
    public InnerPacking(Product product) {
        this.product = product;
        System.out.println("InnerPacking完成");
    }
}
----------------------------------------------------------
public class OuterPacking {
    InnerPacking innerPacking;
    //你给我一个对象,我对这个对象进行操作
    public OuterPacking(InnerPacking innerPacking) {
        this.innerPacking = innerPacking;
        System.out.println("OuterPacking完成");
    }
}
----------------------------------------------------------
    public static void main(String[] args) {
        //假设我们在这里我们做一个完整包装的产品(new 一个拥有双层包装的产品)
        Product product = new Product(12);
        InnerPacking innerPacking = new InnerPacking(product);
        OuterPacking outerPacking = new OuterPacking(innerPacking);
    }


这两种大致对比而言:


  • 老思想:A需要B ,A自己去造一个类
  • IoC:A需要B,你给我传一个B


注入方式(传递方式)发生了改变,由注入属性自己造 变成 直接注入类,而这种改变就使得程序进行解耦,对应到现实生活中,我们可以把产品外包给包装厂,我们不用管颜色,包装纸的大小等等东西,而包装厂只需要我们的产品即可。


在大型项目中,这种思想是非常重要的,如果传统的方式,改一个小东西大片代码都需要改动,而IoC思想改动需要改动的部分即可。


这就是一种降低耦合的代码思想,这种思想称之为 IoC,意为“控制反转”。


  • 反转:容器来帮忙创建及注入依赖对象
  • 正转:在对象中主动控制去直接获取依赖对象


DI


DI 是 Dependency Injection 的缩写,翻译是“依赖注入”的意思。

广义上来讲,DI 等同于 IoC,但是IoC 是“目标”也是一种思想,而目标和思想只是一种指导原则,最终还是要有可行的落地方案,而 DI就属于具体的实现。

IoC (控制反转) 这种解耦合的思想,可以通过DI (依赖注入)的方式实现。

举个生活例子来说就是:生病了吃药(指导思想) 感冒就喝999感冒灵颗粒(具体方案实现)


再看Spring


当我们大概的了解了 IoC 控制反转 DI 依赖注入 这些名词的时候


我们再回过头来看定义:“Spring是包含了众多工具方法的Ioc的容器”


上述的代码 我们感受到了 IoC思想,而Spring 就是 IoC 的容器,也就是我们一直提到的 控制权从程序员到容器。

在学习Spring之前,我们写一个项目,如果A需要使用到B,那么我们自己就new object() 把对象给创建出来,而Spring框架就不需要,Spring这个容器会有我们使用的B,只需要在这个容器中直接把B拿出来使用即可,Spring是怎么创建这个B,什么时候创建的B都不需要我们操心,A中也不需要管一些创建B的细节问题,A只管用B就完了。

也就是说 以前的我们自己创建,我们控制一切,用了Spring以后,容器操心,我们只管用。


控制的什么反转了 ? 获得依赖对象的方式反转了。自己获得 和 直接拿的区别。

相关文章
|
2月前
|
XML Java 数据格式
【SpringFramework】Spring IoC-基于XML的实现
本文主要讲解SpringFramework中IoC和DI相关概念,及基于XML的实现方式。
112 69
|
2月前
|
Java Spring 容器
【SpringFramework】Spring IoC-基于注解的实现
本文主要记录基于Spring注解实现IoC容器和DI相关知识。
54 21
|
2月前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
2月前
|
存储 Java 应用服务中间件
【Spring】IoC和DI,控制反转,Bean对象的获取方式
IoC,DI,控制反转容器,Bean的基本常识,类注解@Controller,获取Bean对象的常用三种方式
|
2月前
|
XML Java 数据格式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
70 6
|
2月前
|
存储 缓存 Java
Spring面试必问:手写Spring IoC 循环依赖底层源码剖析
在Spring框架中,IoC(Inversion of Control,控制反转)是一个核心概念,它允许容器管理对象的生命周期和依赖关系。然而,在实际应用中,我们可能会遇到对象间的循环依赖问题。本文将深入探讨Spring如何解决IoC中的循环依赖问题,并通过手写源码的方式,让你对其底层原理有一个全新的认识。
67 2
|
2月前
|
安全 Java 开发者
Spring容器中的bean是线程安全的吗?
Spring容器中的bean默认为单例模式,多线程环境下若操作共享成员变量,易引发线程安全问题。Spring未对单例bean做线程安全处理,需开发者自行解决。通常,Spring bean(如Controller、Service、Dao)无状态变化,故多为线程安全。若涉及线程安全问题,可通过编码或设置bean作用域为prototype解决。
46 1
|
3月前
|
前端开发 Java Docker
使用Docker容器化部署Spring Boot应用程序
使用Docker容器化部署Spring Boot应用程序
|
3月前
|
Java Docker 微服务
利用Docker容器化部署Spring Boot应用
利用Docker容器化部署Spring Boot应用
66 0
|
2月前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
275 78