【Spring框架】初识Spirng

news2024/11/27 15:51:21

目录

  • Spring是什么?
    • 什么是容器?
    • 什么是IoC?
      • 传统开发
      • ioc 开发(控制反转式程序开发)
    • DI(依赖注入)

Spring是什么?

Spring指的是Spring Framework(Spring框架),它是一个开源框架,有着活跃而庞大的社区,这就是它之所以能长久不衰的原因。Spring支持广泛的应用场景,它可以让Java企业极的应用程序开发起来更简单。

简单概况Spring:Spring是包含了众多工具方法的IoC容器。

什么是容器?

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

例如:

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

什么是IoC?

Spring也是一个容器,Spring是什么容器?Spring是一个IoC容器。

IoC = Inversion of Control 翻译成中文是“控制反转”的意思,也就是说Spring是一个“控制反转”的容器。控制反转(对象的生命周期)

传统开发

不好理解是吧!举个示例:
假如,我们现在构建一辆“车”的程序,我们的实现思路是这样的:

在这里插入图片描述
构建一辆车,然后车需要依赖车身,而车身需要依赖地盘,而地盘需要依赖轮胎,代码实现如下:

汽车类

package old;

public class Car {

    private Framework framework;

    public Car() {
        framework = new Framework();
    }

    public void init() {
    	System.out.println("执行了 car init 方法");
        // 依赖车身
        framework.init();
    }
}

车身类

package old;

public class Framework {

    private Bottom bottom;

    public Framework() {
        bottom = new Bottom();
    }

    public void init() {
    	System.out.println("执行了 framework init 方法");
        // 依赖底盘
        bottom.init();
    }
}

底盘类

package old;

public class Bottom {

    private Tire tire;

    public Bottom() {
        tire = new Tire();
    }

    public void init() {
        System.out.println("执行了 bottom init 方法");
        // 依赖轮胎
        tire.init();
    }
}

轮胎类

package old;

public class Tire {

    private int size = 20;

    public void init() {
        System.out.printf("执行了轮胎初始化方法:size = " + this.size);
    }
}

测试类

package old;

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

在这里插入图片描述

上面的程序中,轮胎的尺寸是固定的,然而随着对车的需求量越来越大,个性化需求也会越来越多,这时候我们就需要加工多种尺寸的轮胎,那这个时候就要对上面的程序进行修改了,修改的代码如下所示:

汽车类

package old;

public class Car {

    private Framework framework;

    public Car(int size) {
        framework = new Framework(size);
    }

    public void init() {
        System.out.println("执行了 car init 方法");
        // 依赖车身
        framework.init();
    }
}

车身类

package old;

public class Framework {

    private Bottom bottom;

    public Framework(int size) {
        bottom = new Bottom(size);
    }

    public void init() {
        System.out.println("执行了 framework init 方法");
        // 依赖底盘
        bottom.init();
    }
}


底盘类

package old;

public class Bottom {

    private Tire tire;

    public Bottom(int size) {
        tire = new Tire(size);
    }

    public void init() {
        System.out.println("执行了 bottom init 方法");
        // 依赖轮胎
        tire.init();
    }
}

轮胎类

package old;

public class Tire {

    private int size = 20;

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

    public void init() {
        System.out.printf("执行了轮胎初始化方法:size = " + this.size);
    }
}


测试类

package old;

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

看了上面的代码,大家会不会想:当最底层代码改动之后,整个调⽤链上的所有代码都需要修
改。

ioc 开发(控制反转式程序开发)

如何去解决这个问题呢?
我们可以尝试不在每个类中⾃⼰创建下级类,如果⾃⼰创建下级类就会出现当下级类发⽣改变操作,⾃⼰也要跟着修改。
此时,我们只需要将原来由⾃⼰创建的下级类,改为传递的⽅式(也就是注⼊的⽅式),因为我们不需要在当前类中创建下级类了,所以下级类即使发⽣变化(创建或减少参数),当前类本身也⽆需修改任何代码,这样就完成了程序的解耦。

汽车类

package ioc;

public class Car {

    private Framework framework;

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

    public void init() {
        System.out.println("执行了 car");
        // 依赖车身
        framework.init();
    }
}


车身类

package ioc;

public class Framework {

    private Bottom bottom;

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

    public void init() {
        System.out.println("执行了 framework");
        // 依赖底盘
        bottom.init();
    }
}

底盘类

package ioc;

public class Bottom {

    private Tire tire;

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

    public void init() {
        System.out.println("执行 bottom");
        // 依赖轮胎
        tire.init();
    }

}

轮胎类

package ioc;

public class Tire {

    private int size = 20;

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

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

测试类

package ioc;

public class App {
    public static void main(String[] args) {
        Tire tire = new Tire(30);
        Bottom bottom = new Bottom(tire);
        Framework framework = new Framework(bottom);
        Car car = new Car(framework);
        car.init();
    }
}

在这里插入图片描述

通⽤程序的实现代码,类的创建顺序是反的,传统代码是 Car 控制并创建了 Framework,Framework 创建并创建了 Bottom,依次往下,⽽改进之后的控制权发⽣的反转,不再是上级对象创建并控制下级对象了,⽽是下级对象把注⼊将当前对象中,下级的控制权不再由上级类控制了,这样即使下级类发⽣任何改变,当前类都是不受影响的,这就是典型的控制反转,也就是IoC 的实现思想。

在这里插入图片描述

DI(依赖注入)

在程序运行期间,动态地将某种依赖关系注入到对象之中。

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

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

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

相关文章

支持无线连接的头戴式耳机,双音腔结构很好听,雷柏VH800上手

平时在PC上玩游戏,除了键鼠一类的操控设备很重要之外,耳机等音频设备也很重要,我用的是头戴式耳机,这种耳机现在有无线版本,用起来很方便,而且延迟很低,可以带来更好的声画同步效果,…

在unity中如何使用chatGPT让虚拟IP动起来

1、导入chatGpt 解决AI智能回答 请根据上一篇文章进行导入:如何使用ChatGPT在unity中进行低代码快速开发?_向视科技,让您看见未来(nbhctec)的博客-CSDN博客 2、文本也有转换工具 可导入unity 插件-RT-Voice PRO 2.…

【回眸】Python入门(五)基础语法列表和词典:Python如何消灭重复性劳动

前言 本篇博客为填坑篇,这个系列的上一篇竟然是2021年的9月30更新的,离谱,差点就到断更两周年纪念日了,后续逐渐走向填坑的每一天,继续创作,希望这个系列的专栏文章能帮助到更多有需要的人。 列表 什么是列…

C++算法:有向无环图拓扑排序(领接链表)

文章目录 前言一、邻接表二、代码1、生成图2、出度、入度计算3、拓扑排序 总结 前言 前文有向无环图实现游戏技能树中我们使用了矩阵存储图的关系,可以称之为邻接矩阵。显然,链表也是可以实现的。在图结构入门一文中,我们也提到了链表存储的…

湖南大学OS-2020(另一张)期末考试解析

【特别注意】 答案来源于wolf以及网络 是我在备考时自己做的,仅供参考,若有不同的地方欢迎讨论。 【试卷评析】 这张卷子很老了,我不知道具体的年份,部分题目可能有用。如果仔细研究应该会有所收获。 【试卷与答案】 一、选…

机器学习 | 决策树 Decision Tree | 概念向

参考视频:【小萌五分钟】机器学习 | 决策树 文章目录 📚决策树是什么(根节点、叶子节点、分支、深度)📚决策树:分类树——算法思想📚分类错误率,熵,基尼指数&#x1f407…

蓝库云|实体店搭建一套巡店管理系统,能让大型连锁店立竿见影

传统巡店工作存在许多问题特别是大型连锁店,包括工作效率低、数据收集不便捷、信息共享困难等。为了解决这些问题,蓝库云认为拥有一套巡店管理系统就显得非常重要了。 巡店管理系统具备以下特点:手机电脑数据同步、实时数据采集和记录、可定…

谷粒商城学习笔记(二):简介- 谷粒商城项目微服务架构图

目录 项目前置知识一、前后端分离开发,分为 内网部署 和 外网部署。二、用户是通过使用 客户端 来完成各种的功能三、网关的作用四、Sentiel组件五、Feign组件六、OAuth2.0认证中心七、SpringSecurity组件八、关于数据存储的解决方案九、定位bug十、注册中心十一、配…

IDEA 远程 Debug 调试,你可以不需要,但是要会

文章目录 前言配置IDEA设置启动脚本改造 细节细节1:停在本地断点,关闭程序后会继续执行吗细节2:jar包代码和本地不一致会怎么样?细节3:日志打印在哪里?细节4:调试时其他人会不会卡住&#xff1f…

湖南大学OS-2022期末考试解析

【特别注意】 答案来源于不确定的光子和wolf 是两位同学在备考时自己做的,仅供参考,若有不同的地方欢迎讨论。 【试卷评析】 这张卷子比较正,个人感觉能够代表接下来几年的考试方向。如果仔细研究应该会有所收获。 【试卷与答案】 一、&…

网络安全认证CISP、CISSP对比及分析

好多网络安全行业或者打算转行该行业的人在纠结学是考取CISP认证还是CISSP认证,作为从事多年网络安全培训认证业务的专家,对这两个认证还是非常了解的,下面是这两个认证的一个对比说明,希望能够帮助到大家更好地选择到适合自己的认…

湖南大学OS-2020期末考试解析

【特别注意】 答案来源于wolf以及网络 是我在备考时自己做的,仅供参考,若有不同的地方欢迎讨论。 【试卷评析】 这张卷子有点老了,部分题目可能有用。如果仔细研究应该会有所收获。 【试卷与答案】 一、选择题(15%&#xff…

基于SSM+Vue的房屋租赁网站-求租合同设计与实现

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下…

“混合办公”已来!

不知不觉中,你已经开启“未来办公模式”了。这听起来好像有些疯狂,但事实就是如此! 试想一下,近三年,你是不是很少去办公室,但却没有耽误工作?你有多少次是在出差的途中开视频会议,…

5分钟了解Kubernetes Ingress和Gateway API

了解Kubernetes Ingress和Gateway API之间的差异,以实现有效的流量管理。原文: Kubernetes Ingress Vs Gateway API Ingress vs Gateway API 概述 Kubernetes如今被广泛应用于容器管理、微服务编排解决方案。对于如何控制微服务的入口流量,Kubernetes提供…

未来制鞋厂的智能化改造: RFID技术的应用

近年来,RFID(射频识别)的应用在生产、物流、零售等方面得到了广泛的应用。在制鞋厂中,RFID的应用也越来越受到关注。 RFID技术可以让制鞋厂实现对鞋子的全程跟踪,从原材料的采购到鞋子的成品出货,都可以实…

OpenAI 新发布GPT 最佳实践;WordPress新增 AI写作助手;国产语言模型TigerBot发布

🦉 AI新闻 🚀 WordPress新增Jetpack AI Assistant AI写作助手 摘要:Automattic公司宣布,为其WordPress新增AI写作助手–Jetpack AI Assistant。该工具可根据用户提示撰写博文、详情页、结构化列表和表格,支持多种口吻…

代码质量规范测量

圈复杂度介绍 圈复杂度(Cyclomatic complexity)是一种代码复杂度的衡量标准,在1976年由Thomas J. McCabe, Sr. 提出。在软件测试的概念里,圈复杂度用来衡量一个模块判定结构的复杂程度,数量上表现为线性无关的路径条数,即合理的预…

脑洞大开:“Excel+中文编程”衍生新型软件,WPS用户:自家孩子

中国人脑洞有多大? 有时候,你不得不承认,中国人的脑洞有时候真是让人意想不到: 你只知道Excel表格,你也知道中文编程,但是你有没有想过,用Excel和中文编程嫁接起来的话,会衍生出一…

sessionStorage、localStorage、cookie你真的会用么

文章目录 前言会话存储:本地存储: 一、sessionStorage介绍使用演示存储数据到sessionStorage从sessionStorage中获取数据删除sessionStorage中的某个键值对清空sessionStorage中的所有数据从Chrome查看sessionStorage的存储情况 二、localStorage介绍使用…