为什么学习SpringSpring框架核心与设计思想(IOC与DI)?

news2024/11/28 10:33:26

  • 博主简介:想进大厂的打工人
  • 博主主页:@xyk:
  • 所属专栏: JavaEE进阶 


目录

文章目录

一、Spring是什么?

二、为什么要学习框架?

三、Spring核心概念

3.1 什么是容器?

3.2 什么是IOC?

四、再谈Spring中的 IOC

五、理解Spring中的 DI


一、Spring是什么?

Spring 框架是一个用于构建企业级 Java 应用程序的开源框架—指的是Spring Framework(Spring 框架)。它提供了一种综合性的编程和配置模型,用于开发灵活、可扩展、可维护的应用程序。Spring 框架提供了许多功能和特性,帮助开发人员快速构建企业应用程序。

具体来说,Spring可以看作一个包含众多工具方法的IOC容器,Spring的出现就是让开发更简单。

那么,什么是IOC?什么又是容器?下面我们来逐渐讲解~

二、为什么要学习框架?

因为学习框架相当于从“小作坊”到“工厂”的升级,小作坊什么都要自己做,工厂是组件式装配,特点就是高效。

框架更加易⽤、简单且高效。

之前我们使用的Servlet有以下缺点:

  1. 添加外部 jar 不⽅便,容易出错,比如添加了⼀个不匹配的外部 jar 版本。
  2. 运行和调试的时候需要配置 Tomcat 不⽅便。
  3. 发布不方便,Servlet 项目必须依靠外置的 Tomcat(外置的 Web 容器)运行。
  4. 路由配置不方便,⼀个访问地址对应⼀个 Servlet 类。

而Spring Boot 对比 Servlet 的优点:

  1. 快速添加外部 jar 包。
  2. 调试项目更方便,无需配置 Tomcat,点击“运行”按钮就可以直接运行项目,因为 Spring Boot 内置了 Tomcat 容器可直接运行。
  3. 发布项目更加方便,无需配置 Tomcat,使用 java -jar xxx.jar 的方式就可以发布。
  4. 对象自动装配。
  5. 添加路由更加方便,无需每个访问地址都添加⼀个类。

Spring框架基本学习应用路线:Spring全家桶 -> MyBatis -> Redis ...等。

三、Spring核心概念

3.1 什么是容器?

通俗来理解,容器就是装某种东西的器件。

在Java开发中,容器通常是指Web容器或IOC容器。Web容器是一种用于运行Web应用程序的容器,例如Tomcat、Jetty等。IoC容器是一种反转控制容器,例如Spring框架的Bean容器,它管理了应用程序中的对象,并负责注入对象之间的依赖关系。

3.2 什么是IOC?

IOC = Inversion of Control 翻译成中⽂是“控制反转”的意思。这是一种思想,在java的常规代码中,我们需要程序猿自己进行 new 对象来控制生命周期,而控制反转就是将对象的生命周期交给Spring来控制,不再根据程序猿来创建对象。

说到这里,有些人可能不理解,下面来举个例子:

假如,我们现在构建⼀辆“汽⻋”的程序,要有车身、底盘、轮胎等
   

传统思想的代码实现:

package old;

/**
 * 传统开发方式, 耦合性问题
 */
// 汽车类
public class Car {
    // 车身
    private Framework framework;

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

    public void init() {
        System.out.println("do car");
        // 汽车的组建依赖于车身
        framework.init();
    }
}

package old;

// 车身类
public class Framework {
    private Bottom bottom;

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

    public void init() {
        System.out.println("do framework");
        // 车身的组建依赖于底盘
        bottom.init();
    }
}

package old;

// 底盘类
public class Bottom {
    private Tire tire;

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

    public void init() {
        System.out.println("do bottom");
        // 底盘的组建依赖于轮胎
        tire.init();
    }
}

package old;

// 轮胎类
public class Tire {
    private int size = 20;

    public void init() {
        System.out.println("size -> " + size);
    }
}

package old;

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

此时,如果我们需要定制个性化的轮胎,就需要改动Tire类的构造方法,进行传入颜色,大小等。但是问题就来了,一旦修改了最底层的Tire,上面所有互相依赖的类,都需要修改构造方法,进行传参。牵一发而动全身!这就是最大的问题!!

在传统的编程模式中,程序猿则需要手动创建对象,并负责它们之间的依赖关系。 而在IOC的编程模式中,程序员只需要定义好对象及其依赖关系的配置,IOC容器则根据这些配置来自动创建和管理对象。通过 IOC编程思想,我们可以很好的解决上述问题。

那么,使用IOC思想的代码:

尝试不在每个类中⾃⼰创建下级类,我们只需要将原来由⾃⼰创建的下级类,改为传递的⽅式(也就是注⼊的⽅式),所以下级类即使发⽣变化(创建或减少参数),当前类本身也⽆需修改任何代码。

public class Car {
    private Framework framework;

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

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

public class Framework {
    private Bottom bottom;

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

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


public class Bottom {
    private Tire tire;

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

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

public class Tire {
    private int size = 20;
    private String color;

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

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


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();
    }
}

代码经过调整,无论底层如何变化,怎么个性化定制,都不会影响上层,整个调用链都不需要改变,这样就完成了代码之间的解耦合。

同时,我们也能发现一些规律: 改进之后的控制权发⽣的反转,不再是上级对象创建并控制下级对象了,⽽是下级对象把注⼊将当前对象中,下级的控制权不再由上级类控制了, 这样即使下级类发⽣任何改变,当前类都是不受影响的,这就是典型的控制反转,也就是 IOC 的实现思想。

四、再谈Spring中的 IOC

那么如何理解”Spring 是一个IOC容器"这句话呢?

既然 Spring 是⼀个 IoC(控制反转)容器,重点还在“容器”⼆字上,那么它就具备两个最基础的功
能:

  • 将Bean对象存⼊到容器;
  • 从容器中取出Bean对象。
     

也就是说学 Spring 最核⼼的功能,就是学如何将对象存⼊到 Spring 中,再从 Spring 中获取对象的过程。即Spring IOC容器就像一个仓库,需要使用的时候直接取,不使用的时候再放回仓库,而此时,对象的创建和销毁的权利都交给 Spring 来管理了。

五、理解Spring中的 DI

Spring的依赖注入(Dependency Injection,DI)是指在应用程序运行过程中,由Spring容器负责创建和管理对象,并将对象之间的依赖关系注入给它们。简单来说:所谓依赖注入,就是由 IoC 容器 在运行期间,动态地将某种依赖关系注入到对象中。DI 也是 IoC思想实现的一种方式~

⽐如说我今天⼼情⽐较好,吃⼀顿好的犒劳犒劳⾃⼰,那么“吃⼀顿好的”是思想和⽬标(是 IoC),但最后我是吃海底捞还是杨国福?这就是具体的实现,就是 (DI)

在Spring中,对象之间的依赖关系分为两种:构造器注入和属性注入。在构造器注入中,Spring容器会通过构造方法来完成对对象的依赖注入。而在属性注入中,Spring容器则会通过setter方法或者直接设置对象的属性来完成依赖注入。

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

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

相关文章

高阶SQL语句

创建一个表一、按关键字排序1.1 单字段排序1.1.1 按分数排序,默认不指定是升序排列1.1.2 分数按降序排列1.1.3 结合where进行条件过滤,筛选地址是nanjing的学生按分数升序排列 1.2 多字段排序1.2.1 查询学生信息先按兴趣id降序排列,相同分数的…

C# List 详解三

目录 11.Equals(Object) 12.Exists(Predicate) 13.Find(Predicate) 14.FindAll(Predicate) 15.FindIndex(Int32, Int32, Predicate) 16.FindIndex(Int32, Predicate) 17.FindIndex(Predicate) C# List 详解一 1.Add(T),2.AddRa…

信息管理系统---Servlet+javaBean+Druid+DButil

这里是学习了Servlet后结合数据库进行增删查改–登录等作为练手项目非常适合 准备工作: 1.数据准备 这张表是用户表,用于登录 CREATE TABLE users (id int NOT NULL AUTO_INCREMENT,username varchar(25) DEFAULT NULL,password varchar(20) DEFAULT…

【C++基础(四)】内联函数和auto关键字

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C初阶之路⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习C   🔝🔝 内联函数 1. 前言2. 内联函数概念3. 内联函数的特性…

数字IC实践项目(7)—CNN加速器的设计和实现(付费项目)

数字IC实践项目(7)—基于Verilog的CNN加速器(付费项目) 写在前面的话项目整体框图神经网络框图完整电路框图 项目简介和学习目的软件环境要求 资源占用&板载功耗总结 写在前面的话 项目介绍: 卷积神经网络硬件加速…

基于深度学习的高精度六类海船检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于深度学习的高精度六类海船检测识别系统可用于日常生活中检测与定位海船目标(散装货船(bulk cargo carrier)、集装箱船(container ship)、渔船(fishing boat)、普通货船&…

[golang gin框架] 41.Gin商城项目-微服务实战之后台Rbac微服务(用户登录 、Gorm数据库配置单独抽离、 Consul配置单独抽离)

上一节抽离了captcha验证码功能,集成了验证码微服务功能,这一节来看看后台Rbac功能,并抽离其中的用户登录,管理员管理,角色管理,权限管理等功能作为微服务来调用 一.引入 后台操作从登录到后台首页,然后其中的管理员管理,角色管理,权限管理等功能可以抽离出来作为 一个Rbac微服…

视频画面尺寸怎么裁剪?裁剪视频画面方法分享

如果我们的视频将在不同的平台或设备上播放,而这些设备具有不同的屏幕比例(如16:9、4:3、1:1等),则可能需要裁剪来适应目标屏幕。这样观看起来会体验效果更佳,但是该怎么裁剪视频的画面呢?给大家分享几种裁…

力扣热门100题之最长连续序列【中等】

题目描述 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1: 输入:nums [100,4,200,1,3,2] 输出&…

Kotlin多平台最佳架构指南

在这篇文章中,我们将对 Kotlin 多平台移动端的最佳架构进行深入探讨。在2023年,作为 Android 开发者,我们会倾向于采用 MVVM 架构,因为它简单、灵活且易于测试。而作为 iOS 开发者,我们可能会选择 MVC、Viper 等架构。…

解决FLink:Missing required options are: slot.name

[ERROR] Could not execute SQL statement. Reason: org.apache.flink.table.api.ValidationException: One or more required options are missing.Missing required options are:slot.name解决 https://ververica.github.io/flink-cdc-connectors/release-2.4/content/connec…

JSR 规范详解和概述

JSR 规范详解 目录概述需求: 设计思路实现思路分析1.JSR 规范详解 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge …

Python计算特征值与特征向量案例+传统方法+雅可比Jacobi迭代法

目录 {1}几个例子🌰 {2}特征值 {3}奇异矩阵 {4}特征向量 {5}特征值和特征向量的计算方法 特征值性质 特征向量性质 {6}巩固练习 {7}迭代法 什么时候收敛?收敛速度如何? {8}雅可比迭代法 {1}几个例子🌰 例1&#xff…

Moshi Vs Gson Vs Kotlin Serialisation性能PK

Moshi Vs Gson Vs Kotlin Serialisation 定义 Gson Gson 是一个Java序列化/反序列化库,用于将Java对象转换为JSON格式,以及将JSON格式转换回Java对象。 Moshi Moshi 是一个现代化的JSON库,适用于Android和Java。它使得将JSON解析为Java对…

Django基本数据库操作

Django基本数据库操作 文章目录 Django基本数据库操作👨‍🏫内容一:基本数据库配置👨‍🔬内容二:ORM基本操作 👨‍🏫内容一:基本数据库配置 👉Django是一个流…

整车总线系列——FlexRay 四

整车总线系列——FlexRay 四 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能…

机器学习方法与原则

机器学习方法与原则 评价指标 TODO 训练集、验证集与测试集 训练集与测试集 训练集(作业): 模型可见样本标签,用于训练模型,样本数量有限。 在训练集上表现好的模型, 在其它未见样本上一定表现好么&am…

【Java】Clonable 接口

如何克隆一个引用所指的对象呢?首先一个前提,他是可克隆的,我们要实现一个Clonable 接口。我们来看一个这个接口: 可以发现里面是空的,我们把这种空接口叫做标记接口,作用就是表示当前对象是可以被克隆的。…

面试 | 双法妙解压缩字符串【遍历统计 + 双指针】

一、题目描述 原题传送门 二、思路分析 首先我们来分析一下解决本题所需要的思路 题目的意思很简单,就是统计原本的字符串中的每个字符出现的次数,然后以【字符,出现的次数】这样的结构来字符串,以起到一个压缩的效果&#xff0c…

Fiddler抓包实战,彻底打通接口测试(二)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 请求查看 Inspec…