Spring容器 IoC思想 DI实现

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 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以后,容器操心,我们只管用。


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

相关文章
|
3天前
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
|
3天前
|
XML Java 数据格式
Spring5入门到实战------6、IOC容器-Bean管理XML方式(自动装配)
这篇文章是Spring5框架的入门教程,详细讲解了IOC容器中Bean的自动装配机制,包括手动装配、`byName`和`byType`两种自动装配方式,并通过XML配置文件和Java代码示例展示了如何在Spring中实现自动装配。
Spring5入门到实战------6、IOC容器-Bean管理XML方式(自动装配)
|
3天前
|
XML Java 数据格式
Spring5入门到实战------8、IOC容器-Bean管理注解方式
这篇文章详细介绍了Spring5框架中使用注解进行Bean管理的方法,包括创建Bean的注解、自动装配和属性注入的注解,以及如何用配置类替代XML配置文件实现完全注解开发。
Spring5入门到实战------8、IOC容器-Bean管理注解方式
|
3天前
|
XML Java 数据格式
Spring5入门到实战------2、IOC容器底层原理
这篇文章深入探讨了Spring5框架中的IOC容器,包括IOC的概念、底层原理、以及BeanFactory接口和ApplicationContext接口的介绍。文章通过图解和实例代码,解释了IOC如何通过工厂模式和反射机制实现对象的创建和管理,以及如何降低代码耦合度,提高开发效率。
Spring5入门到实战------2、IOC容器底层原理
|
XML 数据格式 Java
Spring_DI_XML_01
欢迎移步博客查看-http://futaosmile.oschina.io/coder957 基于XMl的DI 1.设值注入 2.构造注入 3.p命名空间设值注入 4.
808 0
|
XML 数据格式 Python
Spring_DI_XML_02
欢迎移步博客查看-http://futaosmile.oschina.io/coder957 基于XMl的DI 1.集合属性注入 2.array数组属性注入 3.
872 0
|
XML Java 数据格式
Spring_DI_XML_03
欢迎移步博客查看-http://futaosmile.oschina.io/coder957 基于XMl的DI 匿名Bean 匿名内部Bean 同类抽象Bean 异类抽象Bean 多个配置文件-平行关系 多个配置文件-包含关系 Java中的匿名内部类 匿名Bean 没有id,但是可以通过autowire="byType"找到。
730 0
|
21天前
|
Java 测试技术 数据库
Spring Boot中的项目属性配置
本节课主要讲解了 Spring Boot 中如何在业务代码中读取相关配置,包括单一配置和多个配置项,在微服务中,这种情况非常常见,往往会有很多其他微服务需要调用,所以封装一个配置类来接收这些配置是个很好的处理方式。除此之外,例如数据库相关的连接参数等等,也可以放到一个配置类中,其他遇到类似的场景,都可以这么处理。最后介绍了开发环境和生产环境配置的快速切换方式,省去了项目部署时,诸多配置信息的修改。
|
1月前
|
Java 应用服务中间件 开发者
Java面试题:解释Spring Boot的优势及其自动配置原理
Java面试题:解释Spring Boot的优势及其自动配置原理
87 0
|
19天前
|
XML Java 数据库连接
Spring Boot集成MyBatis
主要系统的讲解了 Spring Boot 集成 MyBatis 的过程,分为基于 xml 形式和基于注解的形式来讲解,通过实际配置手把手讲解了 Spring Boot 中 MyBatis 的使用方式,并针对注解方式,讲解了常见的问题已经解决方式,有很强的实战意义。在实际项目中,建议根据实际情况来确定使用哪种方式,一般 xml 和注解都在用。