Spring为什么这么火 之 Spring蕴含的设计思想

news2024/11/27 19:39:30

目录

1、什么是IoC?

2、传统程序开发

3、控制反转式程序开发

4、理解Spring IoC

5、依赖注入【DI】


前言

        很多人说:“Java程序员都是Spring程序员”,从这句话就能看出,对于Java程序员来说,Spring是一项必备技能,


Spring是什么?

        Spring是包含了众多工具方法的IoC容器


1、什么是IoC?

 IoC = Inversion of Control【控制反转】

        即就是说Spring就是一个“控制反转”的容器,还是不懂,没关系,继续往下看,通过传统程序和控制反转式程序对比一下,就明白了~


2、传统程序开发

假设我们现在需要制作一个“口红”的程序,实现思路如下:

        制作一支口红( lipstick),需要依赖于口红管(tube),而口红管则依赖于口红芯(core),口红芯依赖于口红颜料(pigment),最终代码实现如下:



/**
 * 口红对象
 */
class Lipstick {
    private Tube tube;

    public Lipstick() {
        tube = new Tube();
    }

    public void init() {
        System.out.println("执行了Lipstick  init方法");

        //依赖口红管
        tube.init();
    }
}

/**
 * 口红管
 */
class Tube{
    private Core core;

    public Tube() {
        core = new Core();

    }

    public void init() {
        System.out.println("执行了Tube  init方法");

        //依赖口红芯
        core.init();
    }
}

/**
 * 口红芯
 */
class Core {
    private Pigment pigment;

    public Core() {
        pigment = new Pigment();
    }

    public void init() {
        System.out.println("执行了core  init方法");

        //依赖口红颜料
        pigment.init();
    }
}

/**
 * 口红颜料
 */
class Pigment {
    private String color = "死亡芭比粉";
    public Pigment() {

    }
    public void init() {
        System.out.println("执行了pigment  init方法");
    }
}
public class NewLipstickExample {
    public static void main(String[] args) {
        Lipstick lipstick = new Lipstick();
        lipstick.init();
    }
}

打印结果:

         从这里,看起来没有问题呀,但是,我们一起仔细想想看,随着市场用户量越来越大,个性化需求就会越来越多,这个时候,可能需要我们加工出不同颜色的口红,修改后,如下:



/**
 * 口红对象
 */
class Lipstick {
    private Tube tube;

    public Lipstick(String color) {
        tube = new Tube(color);
    }

    public void init() {
        System.out.println("执行了Lipstick  init方法");

        //依赖口红管
        tube.init();
    }
}

/**
 * 口红管
 */
class Tube{
    private Core core;

    public Tube(String color) {
        core = new Core(color);

    }

    public void init() {
        System.out.println("执行了Tube  init方法");

        //依赖口红芯
        core.init();
    }
}

/**
 * 口红芯
 */
class Core {
    private Pigment pigment;

    public Core(String color) {
        pigment = new Pigment(color);
    }

    public void init() {
        System.out.println("执行了core  init方法");

        //依赖口红颜料
        pigment.init();
    }
}

/**
 * 口红颜料
 */
class Pigment {
    private String color ;
    public Pigment(String color) {
        this.color = color;
    }
    public void init() {
        System.out.println("执行了pigment  init方法" +
                " 口红颜色:"+color);
    }
}
public class NewLipstickExample {
    public static void main(String[] args) {
        Lipstick lipstick = new Lipstick("豆沙色");
        lipstick.init();
    }
}

         从上述代码会发现,当我们增加一点点个性化设置,即更改最底层代码后,整个调用链上的代码都需要进行修改【耦合度太高,我们需要解耦】


3、控制反转式程序开发

        控制翻转式程序开发,其实就是对传统式程序开发进行优化【解耦】

        怎么理解呢,传统中,我们制作一支口红,需求者的需求发生改变时,口红的颜色不再是原来的颜色,我们就要去更改,而这里解耦,就是将口红颜色配制外包出去,这样一来,即使颜色发生改变了,我们只需要向代理厂下单即可,自身无需进行修改。

思路如下:

 代码实现:


/**
 * 口红对象
 */
class Lipstick {
    private Tube tube;

    public Lipstick(Tube tube) {

        this.tube = tube ;
    }

    public void init() {
        System.out.println("执行了Lipstick  init方法");

        //依赖口红管
        tube.init();
    }
}

/**
 * 口红管
 */
class Tube{
    private Core core;

    public Tube(Core core) {
        this.core = core;
    }

    public void init() {
        System.out.println("执行了Tube  init方法");

        //依赖口红芯
        core.init();
    }
}

/**
 * 口红芯
 */
class Core {
    private Pigment pigment;

    public Core(Pigment pigment) {
        this.pigment = pigment;
    }

    public void init() {
        System.out.println("执行了core  init方法");

        //依赖口红颜料
        pigment.init();
    }
}

/**
 * 口红颜料
 */
class Pigment {
    private String color ;
    public Pigment(String color) {

        this.color = color;
    }
    public void init() {
        System.out.println("执行了pigment  init方法" +
                " 口红颜色:"+color);
    }
}
public class NewLipstickExample {
    public static void main(String[] args) {
        Pigment pigment = new Pigment("丝绒红棕色");
        Core core = new Core(pigment);
        Tube tube = new Tube(core);
        Lipstick lipstick = new Lipstick(tube);
        lipstick.init();
    }
}

结果:

 

        经过这样的调整后,无论底层类怎样变化,整个调用链是不需要做改变的,也就是完成了代码之间的解耦,实现了更加灵活、通用的程序设计啦~ 

二者对比:

 

        我们对比后,会发现,传统的程序的类的创建,和正常流程是反的,也就是我们都已经要去使用了,才开始去创建,改进后的控制权发生反转,就不再是上级对象创建并控制下级对象了,而是把下级对象注入到当前对象中,下级的控制权不再是由上级类控制了,这样即使下级类发生任何改变,当前类都是不受影响的,这就是典型的控制反转,也就是IoC的实现思想 


4、理解Spring IoC

上述我们说,Spring是一个IoC容器,重点就是容器,容器所具备的功能就是:

  • 放入东西至容器中
  • 从容器中取出东西

即Spring最核心功能就是,学习如何将对象存入Spring中,再从Spring中获取对象的过程 


5、依赖注入【DI】

DI——Dependency Injection【依赖注入】

 你没见过?我不信,咱们之前学习Servlet可是见了很多次了

问:究竟注入是什么意思啊?

答:注入,就是将一个东西拿过来用

DI那就是引入依赖,直接拿过来用

        官方一点:所谓依赖,就是IoC容器在运行期间,动态的将某种依赖关系注入到对象之中。

        因此,依赖注入(DI)和控制反转(IoC)是从不同角度去描述同一件事物,就是指通过引入IoC容器,利用依赖关系注入的方式,实现对象之间的解耦 

IoC是一种思想,DI是一种实现


 总结

  1. Spring是一个包含众多工具的IoC容器
  2. IoC和DI的区别:IoC是一种思想,DI是具体实现
  3. Spring两个核心功能:存 + 取

好啦!本期结束啦,我们下期见~ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/153362.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mathorcup数学建模竞赛第六届-【妈妈杯】B题:车位分布的优化设计与评价(附一等奖获奖论文、C++和matlab代码)

赛题描述 随着现代社会经济的快速发展,房地产成为国家经济发展中重要的经济增长点之一。而小区内汽车停车位的分布对于小区居民的上下班出行影响很大。请建立数学模型,解决下列问题: 问题1:分析评判小区汽车停车位分布是否合理的几个关键指标,建立评判车位分布合理的数学…

C语言常用字符串函数

专栏:C语言 每日一句:别在乎别人的目光,自己只管一心走路。熬过去,你就能看到柳暗花明,熬过去,你就能看到雨后彩虹,熬过去,你就能看到动人风景。 字符串函数前言一、求字符串长度&am…

UDS - 10.3 ECUReset (11) service

10.3 电子控制单元复位(11)服务 来自:ISO 14229-1-2020.pdf 10.3.1 服务说明 客户端使用ECUReset服务请求服务器重置。 此服务请求服务器基于ECUReset请求消息中嵌入的resetType参数值的内容有效地执行服务器重置。ECUReset肯定响应消息&am…

剑指 Offer 26树的子结构(相关话题:对称性递归,在线算法)

目录 开篇引言 题目描述 代码实现 题目拓展 拓展解读 一类 100. 相同的树 226. 翻转二叉树 104. 二叉树的最大深度 110. 平衡二叉树 543. 二叉树的直径 617. 合并二叉树 572. 另一个树的子树 965. 单值二叉树 二类 101. 对称二叉树 解题总结 开篇引言 力扣上…

Vue引入并使用Element-UI组件库的两种方式

前言 在开发的时候,虽然我们可以自己写css或者js甚至一些动画特效,但是也有很多开源的组件库帮我们写好了。我们只需要下载并引入即可。 vue和element-ui在开发中是比较般配的,也是我们开发中用的很多的,下面就介绍下如何在eue项…

【力扣/牛客刷题】二叉树篇

作者:✿✿ xxxflower. ✿✿ 博客主页:xxxflower的博客 专栏:【力扣、牛客刷题】篇 语录:⭐每一个不曾起舞的日子,都是对生命的辜负。⭐ 文章目录100. 相同的树572. 另一棵树的子树226. 翻转二叉树平衡二叉树101.对称二…

C++11之后的decltype类型指示符

C11之后的decltype类型指示符一、什么是decltype类型指示符二、typeid运算符三、使用decltype指示符四、decltype和引用五、decltype(auto)六、本章代码汇总一、什么是decltype类型指示符 有时会遇到这种情况:希望从表达式的类型推断出要定义的变量的类型&#xff…

深度对比学习综述

本文综合考察了对比学习近年的发展和进步, 提出一种新的面向对比学习的归类方法, 并基于提出的归类方法, 对现有对比研究成果进行系统综述, 并评述代表性方法的技术特点和区别, 系统对比分析现有对比学习方法在不同基准数据集上的性能表现。 摘要 在深度学习中, 如何利用大量、…

Linux - 目录与文件操作

目录1.操作目录1.1 目录切换1.2 浏览目录1.3 目录创建1.4 目录删除1.5 复制目录1.6 移动或重命名目录2. 操作文件2.1 查找文件2.2 查看文件信息2.3 查看文件内容2.4 创建文件2.5 文件修改-vim2.6 删除文件2.7 复制和重命名文件3. 文件或目录进行压缩或解压3.1 压缩3.2 解压1.操…

链路追踪工具之Zipkin

Zipkin是一个分布式跟踪系统,Zipkin的设计是基于谷歌的Google Dapper论文,它可以帮助收集时间数据,在microservice架构下,通过链路追踪,可以便捷的分析服务调用延迟问题。每个应用程序向Zipkin server端报告数据&#…

【高光谱、多光谱和全色图像融合】

HyperFusion: A Computational Approach for Hyperspectral, Multispectral, and Panchromatic Image Fusion (超融合:高光谱、多光谱和全色图像融合的计算方法) 高空间分辨率的高光谱图像(HSI)和多光谱图像&#xff…

链表热门面试题(二)

目录前言一、删除链表的倒数第 N 个结点二、两两交换链表中的节点三、旋转链表四、删除排序链表中的重复元素五、删除排序链表中的重复元素 II六、反转链表II七、删除链表中的节点八、奇偶链表前言 一、删除链表的倒数第 N 个结点 题目: 方法1:找到删除…

【Java多线程】创建多线程方式一

线程的创建和启动 *Java语言的JVM允许程序运行多个线程,它通过java.lang.Thread类来体现。 *Thread类的特性 每个线程都是通过某个特定Thread对象的run()方法来完成操作的,经常 把run()方法的主体称为线程体 通过该Thread对象的start()方法来启动这个…

判断两条线段是否相交

参考链接: 1 2 一、判断线段是否相交需要下面两步: (1)快速排斥实验 (2)跨立实验 二、第一步快速排斥实验 对上图两条L1,L2线段来说,L1 x的最大值为d端点x5,L2 x的最小值为a端点x…

RobotFramework环境安装和入门

环境安装1、安装python建议版本3.7,Robot Framework不支持python最新版。 可以通过以下地址下载https://www.python.org/ftp/python/3.7.3/python-3.7.3-amd64.exe安装过程中选择添加到环境变量。2、安装Robot Framework以及所需组件注意各个组件的版本号&#xff0…

LVGL学习笔记15 - 文本框TextArea

目录 1. Parts 2. 样式 2.1 修改背景bg 2.2 修改边界border 2.3 修改文本 2.3.1 lv_textarea_add_char 2.3.2 lv_textarea_add_text 2.3.3 lv_textarea_set_text 2.3.4 设定可输入的字符 2.3.5 删除字符 2.3.6 设定字符串最大长度 2.4 滚动条 2.4.1 滚动方向 2.4.2 …

RHCE学习笔记-133-1

RH133-01 installation 光盘引导后,在提示符下输入:linux askmethod 可以支持:local cdrom,hard drive,nfs image,ftp,http方式 cpu on x86 2个物理超线程CPU 使用smp or hugemem kernel可以支持 32个物理cpus 内存 标准x86 kernel 4G smp i686/athlon kernel 16G hugemem SMP …

创建新分支,基于某一分支创建新分支,git push --set-upstream origin

背景: 基于hcc1.2的开发分支拉去hcc_hotfix_1.2.0分支,解读:在仓库中基于某个分支,创建一个新的分支 做法(解决): 1、第一步:git branch hcc_hotfix_1.2.0 2、第二步:g…

葡萄城邀您参与「表格技术开发者新年分享会」,共话表格技术新未来!

数据资产是企业最重要的资产之一,表格也是企业最普遍的数据整理手段。在数字经济时代,各行业飞速发展,拥抱数字化、进行数字化升级已成为大势所趋,企业对协同办公、大数据分析、表格智能化应用等领域的需求也呈爆发式增长&#xf…

GrapeCity Documents Image Viewer JavaScript Crack

GrapeCity Documents Image Viewer 是跨平台 JavaScript 图像查看器 允许用户使用我们的 JavaScript 图像查看器在您的 Web 应用程序中查看和编辑图像。采集 by Ω578867473 支持多种图像格式 适用于所有现代浏览器和框架,包括 Edge、Chrome、Firefox、Opera、Saf…