当前位置: 首页 > article >正文

Spring核心与设计思想

日升时奋斗,日落时自省 

目录

1、Spring概念

1.1、容器

1.2、IoC

1.2.1、IoC对比传统程序

1.2.2、举例说明

1.2.3、总结

2、DI概念理解


1、Spring概念

如果学java我们通常说的Spring就是指是Spring Framework(Spring框架),是一个开源框架,有众多佬维系着,Spring支持应用广泛,让开发更加简单

概念理解  Spring:Spring是包含了众多工具方法的IoC容器

首先先确定一个概念:IoC是一种思想,不是一个工具,而Spring正式用于IoC思想

注:重点在于容器和IoC的理解

1.1、容器

容器其实是就是我们日常理解的概念,能承载一些东西,例如:杯子可以承载水;杯子就是一个容器

此处的容器只不过承载的是代码了

我们之前也学过容器:

<1>List/Map   : 数据存储容器

<2>Tomcat     : Web容器(存储Web项目)

1.2、IoC

Spring就是一个容器,但是这个容器具有IoC思想的容器(IoC容器)

IoC全称:Inversion of Control 翻译成中文是“控制反转”的意思,也就是说Spring是一个“控制反转”容器;

IoC思想怎么理解:“控制反转”:重点反转

1.2.1、IoC对比传统程序

<1>传统情况下:

当前有个 A -->B -->C  表示A控制B --> B控制C 这就是一个日常的操作

缺陷:如果C出现问题,就会导致 B出现问题,B出现问题,就会导致A出现问题(连锁问题)

我们代码也是如此:上层控制下层,耦合性很高,会给编写代码的人员带来后期维护的大难题,改动下层的一个代码,上层代码同样也要修改(所有点与点之间的联系都是依赖关系,被动关系)

<2>IoC情况下:

还是以A -->B -->C为例,IoC思想就是反转当前状态,A原来是掌控B的,但是现在让A只加载B,让其他人来操作B的使用,这样A在B修改时就会受到B的影响;C也同样让B只加载C,让其他人来操作C的使用,B在C修改的同时也不会影响到B;

上下层之间就降低了耦合性,如果我要修改C不会影响B,更不会影响A

1.2.2、举例说明

以一辆车的构架说明IoC思想的优势:

传统情况下:

一辆车(Car)需要车身(Framework)来维系,车身需要底盘(Bottom)来维系,底盘需要车轮(Tire)(直属于依赖关系)

注:英文标注表示下面代码的类名

 传统情况的缺陷:当底层代码改动之后,整个调用链上的代码都需要修改

附代码(依赖关系):

Car类的代码:

public class Car {
    private  FrameWork frameWork;
    public Car(int size){
        frameWork=new FrameWork(size);
    }
    public void init(){
        System.out.println("do car");
        frameWork.init();
    }

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

 Framework类的代码:

public class FrameWork {
    private Bottom bottom;
    public FrameWork(int size){
        bottom=new Bottom(size);
    }
    public void init(){
        System.out.println("do framework");
        bottom.init();
    }
}

Bottom类的代码:

public class Bottom {
    private Tire tire;
    public Bottom(int size){
        tire=new Tire(size);
    }
    public void init(){
        System.out.println("do bottom");
        tire.init();
    }
}

Tire类的代码:

public class Tire {
    private int size=17;
    public Tire(int size){
        this.size=size;
    }
    public void init(){
        System.out.println("size -> "+size);
    }
}

IoC思想:

 附代码:

Car类代码:

public class Car {
    private FrameWork frameWork;
    public Car(FrameWork frameWork){
        this.frameWork=frameWork;
    }
    public void init(){
        System.out.println("do car...");
        frameWork.init();
    }
}

 Framework类代码:

public class FrameWork {
    private Bottom bottom;
    public FrameWork(Bottom bottom){
        this.bottom=bottom;
    }
    public void init(){
        System.out.println("do FrameWork...");
        bottom.init();
    }
}

Bottom类代码:

public class Bottom {
    private Tire tire;
    public Bottom(Tire trie){
        this.tire=trie;
    }
    public void init(){
        System.out.println("do Bottom...");
        tire.init();
    }
}

Trie类代码:

public class Tire {
    private int size=12;
    public Tire(int size){
        this.size=size;
    }
    public void init(){
        System.out.println("size -> "+size);
    }
}

Test测试类:

public class Test {
    //IoC是一种思想,不是一种插件,在很多地方都可以表现出来,主要是为了解耦性
    //降低代码的连接性,防止改一个代码而出现一连串的错误
    //IoC也叫做控制反转
    public static void main(String[] args) {
        Tire tire=new Tire(12);
        Bottom bottom =new Bottom(tire);
        FrameWork frameWork=new FrameWork(bottom);
        Car car=new Car(frameWork);
        car.init();
    }
}

1.2.3、总结

Spring是包含了多个工具方法的IoC容器,一个IoC(控制反转)容器,具备两点功能

<1>将对象存入容器中;

<2>从容器中取出对象;

Spring的核心功能,就是将对象存入到Spring中,再从Spring中获取对象的过程,对象的创建和销毁的权利都交给Spring来管理了,Spring本身又具备了存储对象和获取对象的能力

Spring优势:将对象存储在IoC容器相当于将以后可能用的所有工具制作好都放到仓库中,需要的时候直接取就行了,用完再把它放回到仓库,new对象的方式相当于,每次需要工具了,才现做,用完也不会保存,下次再调用的时候需要再new,,这就是IoC容器和普通程序开发的区别

2、DI概念理解

提到IoC就会提及到DI,DI是Dependency Injection的缩写,翻译过来就是“依赖注入”

所谓以来依赖注入,就是由IoC容器在运行期间,动态地将某种依赖关系注入到对象中,依赖注入(DI)和控制反转(IoC)是从不同的角度的描述同一件事情,无非通过引入IoC容器,利用依赖注入的方式,实现对象之间的解耦

区别:

<1>IoC是一种思想,只是一种指导原则

<2>DI就是一种具体的实行方案


http://www.kler.cn/news/10136.html

相关文章:

  • 如何使用golang库gqlgen?如何在golang中实现graphql请求?
  • 环形缓冲区
  • 14 个快速简洁的单行 JavaScript 代码解决方案
  • 报名截至在即 | “泰迪杯”挑战赛最后一场赛前指导直播!
  • java 泛型 万字详解(通俗易懂)
  • 【Linux系统文件管理(cat,awk指令)和网络IP配置,广播地址,修改子网掩码以及ping网关地址】
  • nova7换红米k60
  • NodeRED学习(五)http websoket
  • 【WebRTC技术专题】更进一步,核心组件RTP/RTCP数据传输协议 (3)
  • 理解 与 计算 物联网产品的电池使用寿命
  • Golang每日一练(leetDay0033) 二叉树专题(2)
  • c#多线程
  • 人工智障对话日记1:为狗写诗
  • 面试官在线改简历 | 只有6秒!程序员简历这样写才能抓住科技公司大佬的眼球
  • pdf转换成word怎么转换?这个方法一学就会!
  • C语言文件操作复习回顾(1)
  • 基于STM32的倒车雷达系统设计
  • JAVA解析XML时的内存消耗问题
  • IronOCR for .NET crack,IronOCR的独特功能
  • CMake入门教程【核心篇】8.0构建目标
  • 2023-03-18青少年软件编程(C语言)等级考试试卷(一级)解析
  • 是时候告别这些 Python 库了
  • 你真的会用background属性?
  • 【51单片机Task】:led十六进制控制led灯详解、按键控制流水灯、跑马灯等任务
  • x210官方uboot配置编译
  • DNS服务器配置
  • 机器学习和深度学习在气象中的应用(台风预报只能订正、风速预报订正、LSTM 方法预测 ENSO)
  • 基于Spring boot和Vue3的博客平台:系统通知、评论回复通知、专栏更新通知、用户角色与权限管理模块
  • 数据技术嘉年华星光璀璨,云和恩墨全栈数据技术能力闪耀会场
  • Vue实现自动化平台(五)--用例编辑页面