JavaEE2-Spring核心与设计思想

news2024/9/20 22:51:38

目录

1.Spring是什么?

2.容器是什么?

3.IoC是什么?

3.1.传统程序开发

3.2.控制反转式程序开发

3.3.对比总结规律

4.理解Spring IoC

4.1.将对象(Bean)存入到容器(Spring);

4.2.从容器中取出对象。

5.DI概念说明


1.Spring是什么?

Spring指Spring Framework(Spring框架),它是一个开源免费框架,有着活跃而庞大的社区(版本升级迭代快),支持广泛的应用场景,能让Java企业级的应用程序开发起来更简单。因此而长久不衰。

一句话概括:Spring是包含了众多工具方法的IoC容器

2.容器是什么?

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

之前接触的容器有:

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

3.IoC是什么?

IoC=Inversion of Control翻译成中文是“控制反转”的意思,也就是之前需要自己去控制的东西现在交给Spring框架去控制。

3.1.传统程序开发

例:构建一辆车(Car Class),而车需要依赖车身(Framework Class),而车身需要依赖底盘(Bottom Class),而底盘需要依赖轮胎(Tire Class):

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

    /**
     * 汽车对象
     */
    static class Car {
        public void init() {
            //依赖车身
            Framework framework = new Framework();
            framework.init();
        }
    }

    /**
     * 车身类
     */
    static class Framework {
        public void init() {
            //依赖底盘
            Bottom bottom = new Bottom();
            bottom.init();
        }
    }

    /**
     * 底盘类
     */
    static class Bottom {
        public void init() {
            //依赖轮胎
            Tire tire = new Tire();
            tire.init();
        }
    }

    /**
     * 轮胎类
     */
    static class Tire {
        private int size = 30;
        public void init() {
            System.out.println("轮胎尺寸:" + size);
        }
    }
}

传统程序开发的缺陷:轮胎的尺寸是固定的,然而随着对车的需求量越来越大,个性化需求也越来越多,此时就需要加工多种尺寸的轮胎,需对以上代码进行修改:

public class NewCarUpdateExample {
    public static void main(String[] args) {
        Car car = new Car(20);
        car.run(); //和init()方法是一个意思
    }

    /**
     * 汽车对象
     */
    static class Car {
        private Framework framework;
        
        public Car(int size) {
            framework = new Framework(size);
        }
        
        public void run() {
            //依赖车身
            framework.init();
        }
    }

    /**
     * 车身类
     */
    static class Framework {
        private Bottom bottom;
        
        public Framework(int size) {
            bottom = new Bottom(size);
        }
        
        public void init() {
            //依赖底盘
            bottom.init();
        }
    }

    /**
     * 底盘类
     */
    static class Bottom {
        private Tire tire;
        
        public Bottom(int size) {
            tire = new Tire(size);
        }
        
        public void init() {
            //依赖轮胎
            tire.init();
        }
    }

    /**
     * 轮胎类
     */
    static class Tire {
        //尺寸
        private int size;
        
        public Tire(int size) {
            this.size = size;
        }

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

以上程序的问题:由于在每个类中自己创建下级类,当最底层的代码改动之后,整个调用链上的所有代码都需要修改。

3.2.控制反转式程序开发

为解决传统开发中的缺陷,便不在每个类中自己创建下级类,而是将原来由自己创建的下级类,改为传递(注入)的方式,这样下级类即使发生变化(创建或减少参数),当前类本身也无需修改任何代码,就完成了程序的解耦

PS:解耦指的是解决了代码的耦合性/程序相关性。好程序代码的耦合性是很低的。

好比:打造一辆完整的汽车,如果所有的配件都是自己造,那么当客户需求发生改变时,比如轮胎尺寸不再是原来尺寸了,那就要自己动手来改了;但如果把轮胎外包出去,那即使轮胎尺寸改变,也只需向代理工厂下订单就行,自身不需要出力。

基于以上思想,对以上代码进行修改,修改轮胎尺寸并添加材质,创建子类的方式->注入传递的方式:

public class IocCarExample {
    public static void main(String[] args) {
        Tire tire = new Tire(20, "碳纤维"); //只需改一行代码
        Bottom bottom = new Bottom(tire);
        Framework framework = new Framework(bottom);
        Car car = new Car(framework);
        car.run();
    }

    static class Car {
        private Framework framework;

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

        public void run() {
            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;
        //材质
        private String type;

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

        public void init() {
            System.out.println("轮胎尺寸:" + size + " | 材质:" + type);
        }
    }
}

3.3.对比总结规律

传统程序开发对象创建顺序:Car->Framework->Bottom->Tire;

控制反转式程序开发对象创建顺序:Tire->Bottom->Framework->Car。

改进之后的控制权发生反转,不再是上级对象创建并控制下级对象了,而是下级对象注入到当前对象中,下级的控制权不再由上级类控制了,这样即使下级类发生任何改变,当前类都是不受影响的,这就是典型的控制反转,也是IoC的实现思想。

4.理解Spring IoC

Spring是一个IoC容器(不代表Spring等于IoC容器,Spring只是IoC容器中的一种),它就具备了最基础的功能:

4.1.将对象(Bean)存入到容器(Spring);

4.2.从容器中取出对象。

对象的创建和销毁权力都交给Spring来管理了,它本身又具备了存储对象和获取对象的能力。程序员不需要自己去new对象了。

将对象存入到IoC容器中:相当于将以后可能用的所有工具制作好都放到仓库中,需要的时候直接取,用完再放回仓库。

new对象:相当于每次需要工具时才现做,用完就扔掉也不保存,下次再用的时候还得重做。

Spring框架相比传统写法的优点

1).之前需要一个对象是需要去new的,现在不用去new,直接去spring中去取,好处是不再去关心一个对象它是什么时候创建的,什么时候销毁的,需要用的时候直接去用就行。

2).我直接去用一个对象,这个对象的修改,它的构造函数加上一个/多个参数或者去掉一个/多个参数,与我无关,我的代码不需要去管,直接去用就行。当最底层的代码发生变化时,我当前的代码是不需要发生改变的,从而实现了代码解耦的功能。

5.DI概念说明

DI是Dependency Injection的缩写,即“依赖注入”。依赖注入就是由IoC容器在运行期间,动态地将某种依赖关系注入到对象之中(在程序运行期间,自动地将某个对象从Spring中拿出来以供当前类使用)。

所以,依赖注入(DI)和控制反转(IoC)是从不同的角度描述同一件事情:通过引入IoC容器,利用依赖关系注入的方式,实现对象之间的解耦。

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

好比:今天吃顿好的->IoC;具体吃海底捞还是杨国福?->DI。

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

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

相关文章

LINUX---进程

目录相关概念1.什么是程序,什么是进程,有什么区别2.如何查看系统中有哪些进程3.进程标识符4.父进程,子进程5.C程序的存储空间是如何分配的创建进程函数forkvforkfork创建进程:vfork创建进程:进程退出正常退出:异常退出…

在XXX中找到了XXX的副本,但是当前代码与XXX中内置的版本不同【几种解决方案】

Microsoft VS警告类似如图所示: 然后发现编译编写好的代码无法打断点。定义的变量无法获取。 方案一: 把提示的该文件备份在其他文件夹一份,然后在项目中删除该文件。再把备份的文件放到该项目中。然后再编译。 方案二(参考该博客…

Udev设备管理器

udev 引入 在2.4内核中 引入了 devfs,他支持设备节点的动态创建。devfs提供了在内存中的文件系统中创建设备节点的能力。设备驱动程序能够自主的管理自己的设备文件。而命名节点的任务还是落到了设备驱动程序头上。但是,设备命名策略是可管理的&#xf…

【设计模式】结构型模式·适配器模式

学习汇总入口【23种设计模式】学习汇总(数万字讲解体系思维导图) 写作不易,如果您觉得写的不错,欢迎给博主来一波点赞、收藏~让博主更有动力吧! 一. 概述 将一个类的接口转换成客户希望的另外一个接口,使得原本接口不兼容而不能一…

分布式搜索引擎--Elasticsearch

1.1 相关术语 和mysql类比 索引:数据库,database,6.0以后变化,对应表 类型:table,6.0以后变化,废弃 文档:一张表里的一行 字段:一个属性就是一个字段 和分布式相关 集群…

NLP学习笔记(六) Transformer简明介绍

大家好,我是半虹,这篇文章来讲 Transformer\text{Transformer}Transformer,想要获取更多相关文章,欢迎关注 自然语言处理 专栏 在之前的两篇文章中,我们介绍过序列到序列模型以及注意力机制在序列到序列模型中的应用 …

Linux开启Docker远程访问并设置安全访问(证书密钥),附一份小白一键设置脚本哦!

前言 喜欢折腾慢慢看,不喜欢折腾直接跳到小简下文的一键脚本那里,两分钟搞好。 我的博客:https://blog.ideaopen.cn 我的公众号:小简聊开发 开启远程访问 编辑docker.service文件 vi /usr/lib/systemd/system/docker.service # …

Python FastAPI 框架 操作Mysql数据库 增删改查

2 比 1 更容易理解,可以先看2(单文件级别) 1、FastAPI 框架 操作Mysql数据库(项目多文件级别) FastAPI 可以使用任何您想要的关系型数据库。 在这里,让我们看一个使用着SQLAlchemy的示例。 您可以很容易地将SQLAlchemy支持任何…

每天进步一点点,今天来学结构体

什么是结构体? C 语言允许用户自己指定这样一种数据结构,它由不同类型的数据组合成一个整体,以便引用,这些组合在一个整体中的数据是互相联系的,这样的数据结构称为结构体,它相当于其它高级语言中记录。 …

01、数据结构——数组

一、数据结构与算法 数据结构是一门研究组织数据方式的学科,有了编程语言也就有了数据结构。学好数据结构可以编写出更加漂亮、更加有效率的代码。程序数据结构算法数据结构是算法的基础 二、稀疏数组: 1、基本介绍: 当一个数组中大部分元…

【Javascript】文本转语音SpeechSynthesisUtterance

SpeechSynthesisUtterance基本介绍 SpeechSynthesisUtterance是HTML5中新增的API,用于将指定文字合成为对应的语音.也包含一些配置项,指定如何去阅读(语言,音量,音调)等 SpeechSynthesisUtterance基本属性 SpeechSynthesisUtterance.lang 获取并设置话语的语言 SpeechSynthesis…

InfluxDB 笔记

概念 Measurement 类似于表名。 A measurement acts as a container for tags, fields, and timestamps. Tag 补充描述数据的信息,如示例中的location和scientist描述了该数据的采集地和采集人。这两个称为Tag Key,具体的值则称为Tag Value&#xff0c…

小程序基础篇-视图与逻辑

本次学习目标&#xff1a;实现页面间的导航跳转实现下拉刷新实现上拉加载更多知道小程序常用的生命周期函数1.页面导航页面导航指的是页面之前相互的跳转浏览器之间的页面导航有两种&#xff1a;<a>;location.href小程序之间的页面导航有两种&#xff1a;声明式导航&…

告警与恢复告警原理及实现

一、 背景自“双碳”政策提出以来&#xff0c;KaiwuDB 聚焦“数字能源”领域&#xff0c;为用户打造数字能源管理平台&#xff0c;旨在提升综合能源和碳资产管理能力。数字能源管理平台是以 KaiwuDB 为核心建设的云-边-端一体化数据服务平台&#xff0c;致力于为 IoT、工业互联…

前言技术--swagger

目录一、前后端分离的特点二、在没有swagger之前三、swagger的作用四、swagger的优点五、集成swagger5.1 新建springboot项目5.2 集成swagger5.3 开发一个controller用于测试5.4 启动服务&#xff0c;验证集成效果六、swagger常用注解七、swagger使用综合案例一、前后端分离的特…

Python的PyQt框架的使用-常用控件篇

Python的PyQt框架的使用-常用控件篇一、前言二 、QLineEdit 文本框三 、QPushButton按钮控件四、QRadioButton 单选按钮一、前言 个人主页: ζ小菜鸡大家好我是ζ小菜鸡&#xff0c;小伙伴们&#xff0c;让我们一起来学习Python的PyQt框架的常用控件。如果文章对你有帮助、欢迎…

第一个程序——构建一个ServerUI

简介 本次程序设计均使用python实现&#xff0c;使用sql server对聊天室用户的数据进行存储。通过python socket套接字编程&#xff0c;实现了在线聊天室的功能&#xff0c;并使用python tkinter进行UI界面的设计。 思路 由计算机网络的基础知识易知&#xff0c;两个主机之间…

基于LSTMGRU的微博突发事件分析与谣言检测(附完整的代码+报告)

问题描述及方法基础 本章主要对课题研究所涉及的机器学习、自然语言处理的原理和方法进行介绍,主要分为四部分,第一部分是将本课谣言检测任务的符号化描述;第二部分是微博数据的预处理,包括语言模型、文本分词等技术;第三部分与第四部分分别是本文搭建的微博谣言检测模型所…

py字符串的格式化笔记

print():和cjava差不多&#xff0c;只是逗号变了&#xff0c;其中 %s 就是模板中的占位符&#xff0c;表示这个位置先占着&#xff0c;待会儿要有数据填入到这里。然后再提供一个元组&#xff0c;里面依次存放需要填入到 %s 位置 的数据。这里是使用变量 (salary,tax,aftertax)…

CSS.前端基础.html

什么是 CSS? CSS 指层叠样式表 (Cascading Style Sheets)样式定义如何显示 HTML 元素样式通常存储在样式表中把样式添加到 HTML 4.0 中&#xff0c;是为了解决内容与表现分离的问题外部样式表可以极大提高工作效率外部样式表通常存储在 CSS 文件中多个样式定义可层叠为一个示…