2-Spring核心与设计思想

news2024/12/25 13:39:39

目录

1.Spring是什么?

2.容器是什么?

3.IoC是什么?

3.1.传统程序开发

3.2.控制反转式程序开发

3.3.对比总结规律

4.理解Spring IoC

4.1.将对象(Bean)存入到容器(Spring);

4.2.从容器中取出对象。

5.DI概念说明


1.Spring是什么?

Spring指Spring Framework(Spring框架),它是一个开源免费框架,有着活跃而庞大的社区(版本升级迭代快),支持广泛的应用场景,能让Java企业级的应用程序开发起来更简单。因此而长久不衰。

一句话概括:Spring是包含了众多工具方法的IoC容器

2.容器是什么?

容器是用来容纳某种物品的(基本)装置。

之前接触的容器有:

  • List/Map->数据存储容器;
  • Tomcat->Web容器。

3.IoC是什么?

IoC=Inversion of Control翻译成中文是“控制反转”的意思,也就是之前需要自己去控制的东西现在交给Spring框架去控制。

3.1.传统程序开发

例:构建一辆车(Car Class),而车需要依赖车身(Framework Class),而车身需要依赖底盘(Bottom Class),而底盘需要依赖轮胎(Tire Class):

public class NewCarExample {
    public static void main(String[] args) {
        Car car = new Car();
        car.init();
    }

    /**
     * 汽车对象
     */
    static class Car {
        public void init() {
            //依赖车身
            Framework framework = new Framework();
            framework.init();
        }
    }

    /**
     * 车身类
     */
    static class Framework {
        public void init() {
            //依赖底盘
            Bottom bottom = new Bottom();
            bottom.init();
        }
    }

    /**
     * 底盘类
     */
    static class Bottom {
        public void init() {
            //依赖轮胎
            Tire tire = new Tire();
            tire.init();
        }
    }

    /**
     * 轮胎类
     */
    static class Tire {
        private int size = 30;
        public void init() {
            System.out.println("轮胎尺寸:" + size);
        }
    }
}

传统程序开发的缺陷:轮胎的尺寸是固定的,然而随着对车的需求量越来越大,个性化需求也越来越多,此时就需要加工多种尺寸的轮胎,需对以上代码进行修改:

public class NewCarUpdateExample {
    public static void main(String[] args) {
        Car car = new Car(20);
        car.run(); //和init()方法是一个意思
    }

    /**
     * 汽车对象
     */
    static class Car {
        private Framework framework;
        
        public Car(int size) {
            framework = new Framework(size);
        }
        
        public void run() {
            //依赖车身
            framework.init();
        }
    }

    /**
     * 车身类
     */
    static class Framework {
        private Bottom bottom;
        
        public Framework(int size) {
            bottom = new Bottom(size);
        }
        
        public void init() {
            //依赖底盘
            bottom.init();
        }
    }

    /**
     * 底盘类
     */
    static class Bottom {
        private Tire tire;
        
        public Bottom(int size) {
            tire = new Tire(size);
        }
        
        public void init() {
            //依赖轮胎
            tire.init();
        }
    }

    /**
     * 轮胎类
     */
    static class Tire {
        //尺寸
        private int size;
        
        public Tire(int size) {
            this.size = size;
        }

        public void init() {
            System.out.println("轮胎尺寸:" + size);
        }
    }
}

以上程序的问题:由于在每个类中自己创建下级类,当最底层的代码改动之后,整个调用链上的所有代码都需要修改。

3.2.控制反转式程序开发

为解决传统开发中的缺陷,便不在每个类中自己创建下级类,而是将原来由自己创建的下级类,改为传递(注入)的方式,这样下级类即使发生变化(创建或减少参数),当前类本身也无需修改任何代码,就完成了程序的解耦

PS:解耦指的是解决了代码的耦合性/程序相关性。好程序代码的耦合性是很低的。

好比:打造一辆完整的汽车,如果所有的配件都是自己造,那么当客户需求发生改变时,比如轮胎尺寸不再是原来尺寸了,那就要自己动手来改了;但如果把轮胎外包出去,那即使轮胎尺寸改变,也只需向代理工厂下订单就行,自身不需要出力。

基于以上思想,对以上代码进行修改,修改轮胎尺寸并添加材质,创建子类的方式->注入传递的方式:

public class IocCarExample {
    public static void main(String[] args) {
        Tire tire = new Tire(20, "碳纤维"); //只需改一行代码
        Bottom bottom = new Bottom(tire);
        Framework framework = new Framework(bottom);
        Car car = new Car(framework);
        car.run();
    }

    static class Car {
        private Framework framework;

        public Car(Framework framework) {
            this.framework = framework;
        }

        public void run() {
            framework.init();
        }
    }

    static class Framework {
        private Bottom bottom;

        public Framework(Bottom bottom) {
            this.bottom = bottom;
        }

        public void init() {
            bottom.init();
        }
    }

    static class Bottom {
        private Tire tire;

        public Bottom(Tire tire) {
            this.tire = tire;
        }

        public void init() {
            tire.init();
        }
    }

    static class Tire {
        //尺寸
        private int size;
        //材质
        private String type;

        public Tire(int size, String type) {
            this.size = size;
            this.type = type;
        }

        public void init() {
            System.out.println("轮胎尺寸:" + size + " | 材质:" + type);
        }
    }
}

3.3.对比总结规律

传统程序开发对象创建顺序:Car->Framework->Bottom->Tire;

控制反转式程序开发对象创建顺序:Tire->Bottom->Framework->Car。

改进之后的控制权发生反转,不再是上级对象创建并控制下级对象了,而是下级对象注入到当前对象中,下级的控制权不再由上级类控制了,这样即使下级类发生任何改变,当前类都是不受影响的,这就是典型的控制反转,也是IoC的实现思想。

4.理解Spring IoC

Spring是一个IoC容器(不代表Spring等于IoC容器,Spring只是IoC容器中的一种),它就具备了最基础的功能:

4.1.将对象(Bean)存入到容器(Spring);

4.2.从容器中取出对象。

对象的创建和销毁权力都交给Spring来管理了,它本身又具备了存储对象和获取对象的能力。程序员不需要自己去new对象了。

将对象存入到IoC容器中:相当于将以后可能用的所有工具制作好都放到仓库中,需要的时候直接取,用完再放回仓库。

new对象:相当于每次需要工具时才现做,用完就扔掉也不保存,下次再用的时候还得重做。

5.DI概念说明

DI是Dependency Injection的缩写,即“依赖注入”。依赖注入就是由IoC容器在运行期间,动态地将某种依赖关系注入到对象之中(在程序运行期间,自动地将某个对象从Spring中拿出来以供当前类使用)。

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

IoC是目标也是一种思想,而目标和思想只是一种指导原则,最终还是要有可行的落地方案,而DI就属于具体的实现。

好比:今天吃顿好的->IoC;具体吃海底捞还是杨国福?->DI。

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

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

相关文章

计算机编程背景

💖 欢迎来阅读子豪的博客(JavaEE篇 🤴) 👉 有宝贵的意见或建议可以在留言区留言 💻 欢迎 素质三连 点赞 关注 收藏 🧑‍🚀码云仓库:补集王子的代码仓库 不要偷走我小火…

classpath类路径是什么

Spring Boot 一、简介 classpath类路径在 Spring Boot 中既指程序在打包前的/java/目录加上/resource目录,也指程序在打包后生成的/classes/目录。两者实际上指的是同一个目录,里面包含的文件内容一模一样。 二、获取classpath路径 以下两种方式均可…

Icarus Verilog

Icarus Verilog 是一个Verilog仿真工具,以编译器的形式工作,将以verilog编写的源代码编译为某种目标格式。如果要进行仿真的话,可以生成一个vvp的中间格式,由其所附带的vvp命令执行。 https://github.com/steveicarus/iverilog …

面试官:请设计一个能支撑百万连接的系统架构!

目录 1、到底什么是连接?2、为什么每次发送请求都要建立连接?3、长连接模式下需要耗费大量资源4、Kafka遇到的问题:应对大量客户端连接5、Kafka的架构实践:Reactor多路复用6、优化后的架构是如何支撑大量连接的 这篇文章&#x…

SQL Server 全文索引的应用

在公司项目中提出了一个需求: 搜索包含指定关键词的数据。得到这需求后,站在技术角度考虑第一时间就联想到使用SQL里面“like”查询语句。进一步分析需求后,发现“Like”查询满足不到实际的要求。 示例: ---------------------…

【Ajax】接口与接口测试工具PostMan

一、接口接口的概念使用 Ajax 请求数据时,被请求的 URL 地址,就叫做数据接口(简称接口)。同时,每个接口必须有请求方式。例如:http://www.liulongbin.top:3006/api/getbooks 获取图书列表的接口(GET请求)ht…

【4 - 降维算法PCA和SVD - 案例部分】菜菜sklearn机器学习

课程地址:《菜菜的机器学习sklearn课堂》_哔哩哔哩_bilibili 第一期:sklearn入门 & 决策树在sklearn中的实现第二期:随机森林在sklearn中的实现第三期:sklearn中的数据预处理和特征工程第四期:sklearn中的降维算法…

为何香港的IB状元特别多?

今年IB预科课程(The International Baccalaureate Diploma Programme,IBDP)公开考试放榜,香港的学校又是大丰收的一年!因为香港今年一共有九十三名IB状元,即IB的总分为四十五分满分,而他们全部取…

Linux 环境部署 Nexus 服务

一 私服是什么? 一个特殊的远程仓库,它是架设在局域网内的仓库服务,供局域网内的开发人员使用。 当Maven需要下载构建的使用, 它先从私服请求,如果私服上没有的话,则从外部的远程仓库下载,然后…

算力服务亟待破局,超聚变向新而行

“超聚变已独立活下来。”超聚变产品线总裁范瑞琦在2023新品发布会上透露。自从一年多前从华为体系独立,超聚变公司的未来就颇受业界关注。一方面,算力产业蒸蒸日上,各方尤为关注超聚变的产业定位以及发展算力产业的着力点;另一方…

mysql存储过程的流程控制

本文来说下mysql存储过程的流程控制语句 文章目录流程控制概述IF语句CASE语句LOOP语句LEAVE语句ITERATE语句REPEAT语句WHILE语句本文小结流程控制概述 存储过程中可以使用流程控制来控制语句的执行。 MySQL中可以使用IF语句、CASE语句、LOOP语句、LEAVE语句、ITERATE语句、REPE…

Cesium设置模型朝向速度矢量方向

Cesium设置模型朝向速度矢量方向 文章目录Cesium设置模型朝向速度矢量方向1. 需求场景2. 技术路线2.1 VelocityOrientationProperty2.2 VelocityVectorProperty3. 参考链接1. 需求场景 现有一段飞机起飞、爬升的轨迹数据,需要在Cesium中模拟出飞行过程动画&#xf…

Lesson 3. 线性回归的手动实现(3.3 线性回归手动实现与模型局限 3.4 机器学习模型结果可信度理论与交叉验证基础)

文章目录一、线性回归手动实现与模型局限1. 线性回归的手动实现2. 线性回归模型局限3. 线性回归的决定系数二、机器学习模型结果可信度理论与交叉验证基础1. 机器学习模型结果可信度理论基础与数据集划分1.1 机器学习模型结果可信度基础理论1.2 数据集切分方法1.3 线性回归手动…

图的关键路径(AOE网络)

文章目录AOE网概念性质研究的问题关键路径概念求解的方法注意事项AOE网 概念 用顶点表示事件, 边弧表示活动, 边弧上的权值表示活动持续的时间, 这样的带权有向无环图叫AOE网. AOE网常用于估算工程完成时间. AOE网和AOV网都是有向无环图, 不同之处在于它们的边和顶点所代表的…

【青训营】Go的高质量编程

Go的高质量编程 本文内容总结自字节跳动青年训练营 第五届 后端组 什么是高质量? 各种边界条件是否完备异常情况能正常处理,稳定性有保障易读易维护 Go语言开发者Dave Cheney指出,编程需要遵循以下原则: 简单性 消除多余的复…

Docker安装和卸载教程

1、安装前先卸载系统上原有的Docker sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine2、安装需要的yum-utils包 需要安装 yum-utils包(该包提供了 yum-c…

研一寒假C++复习笔记--程序的内存模型

目录 1--内存分区模型 2--代码区 3--全局区 4--栈区 5--堆区 6--new操作符 1--内存分区模型 执行C程序时,内存可划分为4个区域,不同区域存放的数据,具有不同的生命周期; ① 代码区:存放函数的二进制代码&#x…

nvcc 编译并行程序时报错gcc: error trying to exec ‘cc1plus‘: execvp: 没有那个文件或目录

一、nvcc 编译程序时报错 gcc: error trying to exec cc1plus: execvp: 没有那个文件或目录 cc1plus 是gcc编译工具链中用到的一个程序 报错非常直白,就是说gcc在执行时找不到这个程序 二、问题解决方法 1.确定是否正确安装gcc、g 如果系统中没有正确安装gcc…

elementUI组件下拉框属性的一些配合使用

文章目录1、单选带搜索功能(自定义搜索)2、下拉多选远程搜索3、下拉多选有默认选项4、下拉多选默认禁用只提供大致思路,大量玩法等你开发【doge】 1、单选带搜索功能(自定义搜索) 例如,我需要实现一个功能…

关于学习的一些建议

本文的主要讲的内容如图👇 文末附有整个Java的学习路线、能力提升和学习建议的思维导图。 快过新年了!在过去的一年里,你们收获了什么呢?在未来的一年里,你们有什么新目标吗? 1.定目标 过去的我往往喜欢…