Spring容器 IoC思想 DI实现

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 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天前
|
XML 缓存 Java
搞透 IOC、Spring IOC ,看这篇就够了!
本文详细解析了Spring框架的核心内容——IOC(控制反转)及其依赖注入(DI)的实现原理,帮助读者理解如何通过IOC实现组件解耦,提高程序的灵活性和可维护性。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
|
26天前
|
Java 测试技术 Windows
咦!Spring容器里为什么没有我需要的Bean?
【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。
|
7天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
14 0
|
1月前
|
Java Spring 容器
Spring IOC、AOP与事务管理底层原理及源码解析
【10月更文挑战第1天】Spring框架以其强大的控制反转(IOC)和面向切面编程(AOP)功能,成为Java企业级开发中的首选框架。本文将深入探讨Spring IOC和AOP的底层原理,并通过源码解析来揭示其实现机制。同时,我们还将探讨Spring事务管理的核心原理,并给出相应的源码示例。
123 9
|
1月前
|
存储 Java 程序员
SpringIOC和DI的代码实现,Spring如何存取对象?@Controller、@Service、@Repository、@Component、@Configuration、@Bean DI详解
本文详细讲解了Spring框架中IOC容器如何存储和取出Bean对象,包括五大类注解(@Controller、@Service、@Repository、@Component、@Configuration)和方法注解@Bean的用法,以及DI(依赖注入)的三种注入方式:属性注入、构造方法注入和Setter注入,并分析了它们的优缺点。
27 0
SpringIOC和DI的代码实现,Spring如何存取对象?@Controller、@Service、@Repository、@Component、@Configuration、@Bean DI详解
|
1月前
|
存储 开发框架 Java
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
文章详细介绍了Spring、IOC、DI的概念和关系,解释了控制反转(IOC)和依赖注入(DI)的原理,并提供了IOC的代码示例,阐述了Spring框架作为IOC容器的应用。
26 0
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
|
28天前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
62 0
|
1月前
|
XML Java 数据格式
Spring的IOC和AOP
Spring的IOC和AOP
45 0
|
6月前
|
XML Java 数据格式
Spring IoC容器初始化过程(xml形式)
Spring IoC容器初始化过程(xml形式)
79 0
|
6月前
|
XML Java 数据格式
Spring5源码(15)-IoC容器启动过程简析及XmlBeanFactory初始化
Spring5源码(15)-IoC容器启动过程简析及XmlBeanFactory初始化
68 1