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

  • 博主简介:想进大厂的打工人
  • 博主主页:@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方法或者直接设置对象的属性来完成依赖注入。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mac如何提取视频中的音频?

mac如何提取视频中的音频?我们经常在平时工作的时候,需要将一个视频里面的音频单独提取出来另做他用,例如很多视频自媒体博主就经常使用这种方法来储备音频素材,这个操作在Windows上面比较容易实现,毕竟有相当多的软件…

计算机网络微课堂学习笔记(详细图解讲解)-长期更新

前言: 计算机网络在信息时代的作用 计算机网络已由一种通信基础设施发展成为一种重要的信息服务基础设施,计算机网络已经像水、电、煤气这些基础设施一样,成为我们生活中不可或缺的一部分 一、因特网概述 (1)网络、…

黑马 pink h5+css3+移动端前端

网页概念 网页是网站的一页,网页有很多元素组成,包括视频图片文字视频链接等等,以.htm和.html后缀结尾,俗称html文件 HTML 超文本标记语言,描述网页语言,不是编程语言,是标记语言,有标签组成 超文本指的是不光文本,还有图片视频等等标签 常用浏览器 firefox google safari…

Git标签管理(对版本打标签,起别名)

tag 理解标签创建标签git tag [name]git show [tagname] 操作标签删除标签git tag -d < tagname > 推送某个标签到远程git push origin < tagname > 理解标签 标签 tag &#xff0c;可以简单的理解为是对某次 commit 的⼀个标识&#xff0c;相当于起了⼀个别名。 …

实际上手体验maven面对冲突Jar包的加载规则 | 京东云技术团队

一、问题背景 相信大家在日常的开发过程中都遇到过Jar包冲突的问题&#xff0c;emm&#xff0c;在最近处理业务需求时我也遇到了不同版本jar包冲突导致项目加载出错的问题。主要是一个完整的项目会不可避免的使用第三方的Jar包来实现功能开发&#xff0c;各种第三方包之间可能…

【Linux】自动化构建工具-make/Makefile详解

前言 大家好吖&#xff0c;欢迎来到 YY 滴 Linux系列 &#xff0c;热烈欢迎&#xff01;本章主要内容面向接触过Linux的老铁&#xff0c;主要内容含 欢迎订阅 YY 滴Linux专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 订阅专栏阅读&#xff1a;YY的《…

跨网段耦合器的作用

你是否曾经遇到过需要跨网段访问设备的问题&#xff1f;比如在工业自动化领域&#xff0c;PLC和数控设备的连接。这时候&#xff0c;远创智控YC8000-NAT就能帮你轻松解决。 1, 远创智控YC8000-NAT是一款功能强大的设备&#xff0c;它可以将LAN1口所连接PLC的IP地址和端口号&a…

使用wxPython和pillow开发拼图小游戏(四)

上一篇介绍了使用本地图片来初始化游戏的方法&#xff0c;通过前边三篇&#xff0c;该小游戏的主要内容差不多介绍完了&#xff0c;最后这一篇来介绍下游戏用时的计算、重置游戏和关闭窗口事件处理 游戏用时的计算 对于游戏用时的记录&#xff0c;看过前几篇的小伙伴可能也发现…

结构型设计模式之代理模式【设计模式系列】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 设计模式系列 期待你的关注哦&#xff01;&#xff01;&#xff01; 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everythi…

springBoot使用webSocket的几种方式以及在高并发出现的问题及解决

一、第一种方式-原生注解&#xff08;tomcat内嵌&#xff09; 1.1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dependency>1.2、配置文件 package …

如何动态修改 spring aop 切面信息?让自动日志输出框架更好用

业务背景 很久以前开源了一款 auto-log 自动日志打印框架。 其中对于 spring 项目&#xff0c;默认实现了基于 aop 切面的日志输出。 但是发现一个问题&#xff0c;如果切面定义为全切范围过大&#xff0c;于是 v0.2 版本就是基于注解 AutoLog 实现的。 只有指定注解的类或…

数据结构之BinaryTree(二叉树)的实现

BinaryTree要实现的方法 总结 remove不在BinNode里&#xff0c;而是BinTree里 递归的两种写法 从上往下&#xff1a;同一对象的递归&#xff08;参数多一个&#xff0c;判空用一句话&#xff09;&#xff0c;子对象的递归&#xff08;参数void&#xff0c;判空用两句话&#…

对于awd

最近我们老师直接说要我准备awd&#xff0c;大概率要我上场我就顺便整理一下awd的资料&#xff08;准备写很多所以建议大家收藏一下&#xff09; 攻防指北 先来一个思维导图 Awd竞赛 AWD(Attack With Defense&#xff0c;攻防兼备)是一个非常有意思的模式&#xff0c;你需要…

Nginx配置整合:基本概念、命令、反向代理、负载均衡、动静分离、高可用

一、基本概念 1.什么是Nginx Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP代理server。其特点是占有内存少。并发能力强&#xff0c;其并发能力确实在同类型的网页server中表现较好。 http服务器 Web服务器是指驻留于因特网上某种类型计算机的程…

IT技术岗的面试技巧分享

我们在找工作时,需要结合自己的现状,针对意向企业做好充分准备。作为程序员,你有哪些面试IT技术岗的技巧?你可以从一下几个方向谈谈你的想法和观点。 方向一:分享你面试IT公司的小技巧 1、事先和邀约人了解公司的基本情况,比如公司的行业,规模,研发人员占比等 2、事先和…

cmder 使用简介

文章目录 1. cmder 简介2. 下载地址3. 安装4. 配置环境变量5. 添加 cmder 到右键菜单6. 解决中文乱码问题 1. cmder 简介 cmder 是一个增强型命令行工具&#xff0c;不仅可以使用 windows 下的所有命令&#xff0c;更爽的是可以使用 linux的命令, shell 命令。 2. 下载地址 …

【C#】MVC页面常见的重定向方式和场景

本篇文章主要简单讲讲&#xff0c;C# MVC 页面常见跳转或者重定向的方式和场景。 在实际项目开发中&#xff0c;在一些特定场景肯定会用到重定向&#xff0c;比如&#xff1a;不同角色跳转到不同视图地址 目录 一、种常见重定向方式1.1、RedirectToAction1.2、RedirectToRoute1…

【算法 -- LeetCode】(025) K 个一组翻转链表

1、题目 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点…

记录一次抓取WiFi驱动日志以及sniffer日志

起因 路由器桥接一个WiFi&#xff0c;然后设备连接这个路由器的WiFi&#xff0c;发现网络不可用&#xff0c;而手机或者电脑连接就没问题&#xff0c;与供应商沟通问题&#xff0c;需要抓取日志&#xff0c;记录一下 抓取WLAN DRIVER WLAN FW3日志 进入开发者模式打开启动WL…

MQTT 与 Kafka|物联网消息与流数据集成实践

MQTT 如何与 Kafka 一起使用&#xff1f; MQTT (Message Queuing Telemetry Transport) 是一种轻量级的消息传输协议&#xff0c;专为受限网络环境下的设备通信而设计。Apache Kafka 是一个分布式流处理平台&#xff0c;旨在处理大规模的实时数据流。 Kafka 和 MQTT 是实现物…