Spring 核心与设计思想

文章目录

  • 1.Spring 是什么?
  • 2.什么是容器
  • 3.什么是IoC
    • 3.1 传统程序开发
    • 3.2 IoC程序开发
    • 3.3 IoC再理解
  • 4.认识DI

1.Spring 是什么?

Spring框架是一个轻量级的企业开发的一站式解决方案,可以基于Spring解决Java EE 开发中的所有问题。
⽤⼀句大白话概括 Spring:Spring 是包含了众多⼯具⽅法的 IoC 容器
看到这,可能你对容器会有所疑问?下面解释什么是容器

2.什么是容器

容器容器是⽤来容纳某种物品的(基本)装置。水杯用来装水的,饭盒用来装大米饭;这里面的水杯、饭盒就是一个容器。
Java中包含的容器:

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

Spring也是一个容器,Spring它是一个IoC容器。

3.什么是IoC

IoC是 Inversion of Control 的缩写,翻译回来就是“控制反转”的意思,这一听“控制反转”绝对懵逼,当时我听见时也懵逼了;不要急,看下面咱会对他进行解释。
IoC不是一种技术,而是一种设计思想。在Java开发中,IoC意味将设计好的对象交给容器控制,而不是传统的在对象内部直接控制。说白话呢,IoC就是为了减小代码的耦合度。
他是如何减小代码间的耦合呢?看下面的例子就很好理解了!

3.1 传统程序开发

假如,我们现在构建一辆车的程序,我们的思路是这样的:
在这里插入图片描述
构建⼀辆⻋(Car Class),然⽽⻋需要依赖⻋身(FrameWork Class),⽽⻋身需要依赖底盘(BottomClass),⽽底盘需要依赖轮胎(Tire Class),最终程序的实现代码如下:

package traditional;

public class NewCarExample {
    public static void main(String[] args) {
        Car car =new Car();
        car.init();
    }
}
//车
class Car {
    private Framework framework;
    public Car() {
        framework = new Framework();
    }
    public void init() {
        framework.init();
    }
}
//车身
class Framework {
    private Bottom Bottom;
    public Framework() {
        Bottom = new Bottom();
    }
    public void init() {
        Bottom.init();
    }
}
//底盘
class Bottom {
    private Tire Tire;
    public Bottom() {
        Tire = new Tire();
    }
    public void init() {
        Tire.init();
    }
}
//车轮
class Tire {
    private int size = 20;
    public void init() {
        System.out.println("轮胎大小是" + this.size);
    }
}

传统程序开发就是当我们需要什么时,我们就在需要的时候new这个类。这样写就有一个缺陷,我们代码中轮胎大小写成20,如果有一天,有客户需要30、15…这样尺寸的轮胎上,我们就要修改这上面的代码,需要在创建 Car类实例时传入size参数;这时,不仅仅需要动Car类还要动下面的其他三个类;也就是当最底层代码改动之后,整个调⽤链上的所有代码都需要修改,可谓是牵一发而动全身。这样写代码的耦合度就很高,下面再看IoC程序开发是如何解决这个问题的!

3.2 IoC程序开发

基于以上思路,我们把调⽤汽⻋的程序示例改造⼀下,把创建⼦类的⽅式,改为注⼊传递(DI)的⽅式,具体实现代码如下:

package IoC;


import sun.dc.pr.PRError;

public class NewCarExample {

    public static void main(String[] args) {
        Tire tire = new Tire();
        Bottom bottom = new Bottom(tire);
        Framework framework = new Framework(bottom);
        Car car = new Car(framework);
        car.init();
    }
    //车
    static class Car {
        private Framework framework;
        public Car(Framework framework) {
            this.framework = framework;
        }
        public void init() {
            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 = 20;
        //自定义大小轮胎
//        public Tire(int size) {
//            this.size = size;
//        }
        public void init() {
            System.out.println("车轮大小是" + size);
        }
    }
}

在这里插入图片描述
对比传统开发和IoC开发,它们两个的不同点,传统开发中创建实例的控制权在程序员手里,而IoC开发是我不关注创建实例的事,谁给我我都能用,这也就是控制反转,看下图就很好理解了。

在传统的代码中对象创建顺序是:Car -> Framework -> Bottom -> Tire
改进之后解耦的代码的对象创建顺序是:Tire -> Bottom -> Framework -> Car
在这里插入图片描述

3.3 IoC再理解

回到主题 Spring上,刚开始说:Spring 是包含了多个⼯具⽅法的 IoC 容器,这就是对Spring 最核⼼的总结。那如何理解“Spring 是⼀个 IoC容器”这句话呢?
既然 Spring 是⼀个 IoC(控制反转)容器,重点还在“容器”⼆字上,那么它就具备两个最基础的功能:

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

Spring 是⼀个 IoC 容器,说的是对象的创建和销毁的权利都交给 Spring 来管理了;而Spring 最核⼼的功能,就是如何将对象存⼊到 Spring 中,再从 Spring 中获取对象的过程.

将对象放入到容器中有什么好处呢?

将对象存储在 IoC 容器相当于将以后可能⽤的所有⼯具制作好都放到仓
库中,需要的时候直接取就⾏了,⽤完再把它放回到仓库。⽽ new 对象的方式相当于,每次在需要⼯具时才现做工具,工具⽤完就扔掉,下次再⽤的时候还得重新做。

在IoC中还有一个技术被使用,只是我们潜移默化的忘记对他进行介绍了,我们下面就来看看它(DI)。

4.认识DI

DI 是 Dependency Injection 的缩写,翻译成中⽂是“依赖注⼊”的意思。

所谓依赖注⼊,就是由 IoC 容器在运⾏期间,动态地将某种依赖关系注⼊到对象之中。所以,依赖注⼊(DI)和控制反转(IoC)是从不同的⻆度的描述的同⼀件事情,就是指通过引⼊ IoC 容器,利⽤依赖关系注⼊的⽅式,实现对象之间的解耦。

IoC 是“⽬标”也是⼀种思想,⽽⽬标和思想只是⼀种指导原则,最终还是要有可⾏的落地⽅案,⽽ DI就属于具体的实现。

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

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

相关文章

CSS 弹性布局

提示:这篇比较重要,做复杂页面时经常会用到!会不断更新❗ 文章目录 前言主轴和侧轴flex-direction 主轴方向flex-wrap 折行justify-content 主轴排列方式flex-start:默认左对齐flex-end:右对齐center:居中s…

Java- IO 及其相关面试题

目录 一、前言二、Java IO 概述输入和输出流2.1.1 定义2.1.2 代码示例 2.2 字节流和字符流2.2.1 定义2.2.2 代码示例 2.3 标准IO和NIO 三、字节流和字符流3.1. 字节流:InputStream和OutputStream3.1.1. FileInputStream和FileOutputStream3.1.2. ByteArrayInputStre…

剑指oferr68-II.二叉树的最近公共祖先

为什么这道题的难度是easy&#xff0c;我感觉挺难的啊&#xff0c;我想了挺久没有一点思路就直接看题解了。题解有两种解法&#xff0c;先看第一种存储父节点 class Solution {Map<Integer,TreeNode> parent new HashMap<Integer,TreeNode>();Set<Integer>…

【网络安全】Burpsuite v2021.12.1安装激活配置快捷启动

Burpsuite v2021.12.1安装&激活&配置&快捷启动 一、下载激活包二、配置JDK11三、启动激活 一、下载激活包 需要下载的内容&#xff1a; Burp Suite jar包JDK11激活jar包汉化jar包 下面是已经下载好的&#xff0c;可以直接使用 BurpSuite网盘下载链接 提取码&#…

【运维】第03讲(上):Nginx 负载均衡常见架构及问题解析

实际上 Nginx 除了承担代理网关角色外还会应用于 7 层应用上的负载均衡&#xff0c;本课时重点讲解 Nginx 的负载均衡应用架构&#xff0c;及最常见的问题。 学前提示 Nginx 作为负载均衡是基于代理模式的基础之上&#xff0c;所以在学习本课时前&#xff0c;你需要对 Nginx …

本地appserv外挂网址如何让外网访问?快解析端口映射

一、appserv是什么&#xff1f; AppServ 是 PHP 网页架站工具组合包&#xff0c;作者将一些网络上免费的架站资源重新包装成单一的安装程序&#xff0c;以方便初学者快速完成架站&#xff0c;AppServ 所包含的软件有&#xff1a;Apache[、Apache Monitor、PHP、MySQL、phpMyAdm…

JavaFX中MVC例子理解

JavaFX可以让你使用GUI组件创建桌面应用程序。一个GUI应用程序执行三个任务&#xff1a;接受用户的输入&#xff0c;处理输入&#xff0c;并显示输出。而一个GUI应用程序包含两个 类型的代码&#xff1a; 领域代码。处理特定领域的数据和遵循业务规范。交互代码。处理用户输入…

Elasticsearch:使用 Elasticsearch 矢量搜索和 FastAPI 构建文本搜索应用程序

在我的文章 “Elastic&#xff1a;开发者上手指南” 的 “NLP - 自然语言处理及矢量搜索”&#xff0c;我对 Elastic Stack 所提供的矢量搜索有大量的描述。其中很多的方法需要使用到 huggingface.co 及 Elastic 的机器学习。这个对于许多的开发者来说&#xff0c;意味着付费使…

【Linux】进程优先级

Linux 进程优先级 为什么要有优先级的划分&#xff1f;Linux 环境设置优先级的具体做法并发运行环境变量如何通过代码获取环境变量 环境变量的来源 为什么要有优先级的划分&#xff1f; 优先级的规定就是为了确定某种资源获取的先后顺序。 本质原因是因为CPU资源是有限的。进程…

KMP算法

KMP KMP 算法是一个快速查找匹配串的算法&#xff0c;它的作用其实就是本题问题&#xff1a;如何快速在「原字符串」中找到「匹配字符串」。 而 KMP 算法的复杂度为 O(mn)实际上是O(N),因为O(M)不可能大于O(N) KMP 之所以能够在 O(mn)复杂度内完成查找&#xff0c;是因为其能…

CentOS环境下的MYSQL8安装

MySQL 安装 参考连接&#xff1a;https://www.cnblogs.com/jasonx1an/p/16690866.html 下载 下载网址&#xff1a;https://dev.mysql.com/downloads/mysql/ 卸载 mariadb 查看 mariadb rpm -qa|grep mariadb卸载 mariadb rpm -e mariadb-libs-5.5.68-1.el7.x86_64 --nodeps再…

概率栅格

欢迎访问我的博客首页。 概率栅格 1. miss 表与 hit 表 1. miss 表与 hit 表 miss 表和 his 表是一维数组&#xff0c;它们存放的都是空闲值。其下标 i i i 代表旧空闲值&#xff0c;元素 t a b l e [ i ] table[i] table[i] 代表旧空闲值 i i i 的新空闲值。表的更新可以用…

Maven —— 项目管理工具

前言 在这篇文章中&#xff0c;荔枝会介绍如何在项目工程中借助Maven的力量来开发&#xff0c;主要涉及Maven的下载安装、环境变量的配置、IDEA中的Maven的路径配置和信息修改以及通过Maven来快速构建项目。希望能对需要配置的小伙伴们有帮助哈哈哈哈~~~ 文章目录 前言 一、初…

安全防御 --- SSL VPN

附&#xff1a;无线项目介绍 SSL VPN 有浏览器的设备就可以使用SSL&#xff0c;进而使用SSL VPN。无需担心客户端问题&#xff0c;所以SSL VPN也称为无客户端VPN。SSL VPN在client to lan场景下特别有优势。 实际实现过程&#xff08;基于TCP实现&#xff09; &#xff08;1&…

MYSQL执行一条SELECT语句的具体流程

昨天CSDN突然抽风 我一个ctrlz把整篇文章给撤掉了还不能复原 直接心态崩了不想写了 不过这部分果然还是很重要,还是写出来吧 流程图 这里面总共有两层结构Server层 储存引擎 Server 层负责建立连接、分析和执行 SQL。MySQL 大多数的核心功能模块都在这实现&#xff0c;主要包…

Java-API简析_java.lang.ProcessBuilder类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/131729933 出自【进步*于辰的博客】 因为我发现目前&#xff0c;我对Java-API的学习意识比较薄弱…

什么是Docker

容器技术和虚拟机 虚拟机 和一个单纯的应用程序相比&#xff0c;操作系统是一个很重的程序&#xff0c;刚装好的系统还什么都没有部署&#xff0c;单纯的操作系统其磁盘占用至少几十G起步&#xff0c;内存要几个G起步。 在这台机器上开启三个虚拟机&#xff0c;每个虚拟机上…

Failed to connect to github.com port 443: Connection refused问题解决

文章目录 一、问题描述&#xff1a;Failed to connect to github.com port 443: Connection refused问题解决二、解决方法一&#xff1a;排查代理问题1、尝试重置代理或者取消代理的方式2、添加全局代理 三、解决方法二&#xff1a;排查DNS解析问题1、第一步&#xff1a;查找gi…

Redis解决Session共享问题

文章目录 一、集群Session共享问题二、Redis存储验证码和对象三、解决状态登录刷新问题 一、集群Session共享问题 session共享问题&#xff1a;多台Tomcat并不共享session存储空间&#xff0c;当请求切换到不同tomcat服务器时导致数据丢失的问题 tomcat可以进行多台tomcat进行…

蓝牙技术|低功耗蓝牙和LE Audio助力游戏设备行业发展

去年&#xff0c;蓝牙技术联盟官方宣布推出LE Audio&#xff0c;它以BLE为基础&#xff0c;旨在更好地兼顾音频质量和低功耗&#xff0c;以在多种潜在应用中显著增强用户体验。这在游戏行业中引起了轰动&#xff0c;由于其延迟显著降低&#xff0c;LE Audio在增强游戏体验方面展…
最新文章