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以后,容器操心,我们只管用。


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

相关文章
|
16天前
|
存储 缓存 Java
Spring面试必问:手写Spring IoC 循环依赖底层源码剖析
在Spring框架中,IoC(Inversion of Control,控制反转)是一个核心概念,它允许容器管理对象的生命周期和依赖关系。然而,在实际应用中,我们可能会遇到对象间的循环依赖问题。本文将深入探讨Spring如何解决IoC中的循环依赖问题,并通过手写源码的方式,让你对其底层原理有一个全新的认识。
38 2
|
16天前
|
安全 Java 开发者
Spring容器中的bean是线程安全的吗?
Spring容器中的bean默认为单例模式,多线程环境下若操作共享成员变量,易引发线程安全问题。Spring未对单例bean做线程安全处理,需开发者自行解决。通常,Spring bean(如Controller、Service、Dao)无状态变化,故多为线程安全。若涉及线程安全问题,可通过编码或设置bean作用域为prototype解决。
27 1
|
1月前
|
XML 缓存 Java
搞透 IOC、Spring IOC ,看这篇就够了!
本文详细解析了Spring框架的核心内容——IOC(控制反转)及其依赖注入(DI)的实现原理,帮助读者理解如何通过IOC实现组件解耦,提高程序的灵活性和可维护性。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
|
28天前
|
前端开发 Java Docker
使用Docker容器化部署Spring Boot应用程序
使用Docker容器化部署Spring Boot应用程序
|
1月前
|
Java Docker 微服务
利用Docker容器化部署Spring Boot应用
利用Docker容器化部署Spring Boot应用
47 0
|
2月前
|
Java 测试技术 Windows
咦!Spring容器里为什么没有我需要的Bean?
【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。
|
1月前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
39 0
|
2月前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
79 0
|
XML 数据格式 Java
Spring_DI_XML_01
欢迎移步博客查看-http://futaosmile.oschina.io/coder957 基于XMl的DI 1.设值注入 2.构造注入 3.p命名空间设值注入 4.
824 0
|
XML 数据格式 Python
Spring_DI_XML_02
欢迎移步博客查看-http://futaosmile.oschina.io/coder957 基于XMl的DI 1.集合属性注入 2.array数组属性注入 3.
888 0