Spring核心思想

news2024/11/28 13:35:54

文章目录

  • 1. Spring核心思想
    • 1.1 Spring是什么
    • 1.2 什么是容器
    • 1.3 什么是loC
      • 1.3.1 传统开发
      • 1.3.2 如何解决传统开发中耦合度高的问题
      • 1.3.3 控制反转程序的编写
    • 1.4 理解Spring loC
    • 1.5 什么是DI

1. Spring核心思想

1.1 Spring是什么

我们通常说的Spring是Spring Framework(Spring框架), 它是一个开源的框架, 拥有着活跃而强大的社区, 它提供了功能强大IOC、AOP及Web MVC等功能,支持广泛的应用场景, 让java企业级应用程序开发更加简单.

用一句话来概括:Spring是一个包含众多工具方法的loC容器.

此时的疑问就是, 什么是容器? 什么是loC容器?

1.2 什么是容器

容器就是用来容纳某种物品的装置 -百度百科
我们之前接触到的容器有

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

1.3 什么是loC

loC(Inversion of Control) 也就是控制反转的意思, 那么如何理解控制反转呢?

1.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 NewCarExample {
    public static void main(String[] args) {
        Car car = new Car(40);
        car.run();
    }

    /**
     * 汽车对象
     */
    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);
        }
    }
}

可以看到, 当最底层的代码发生了变化, 整个调用链上的代码都要发生变化, 也就是耦合度太高

1.3.2 如何解决传统开发中耦合度高的问题

我们可以尝试不在每个类中⾃⼰创建下级类,如果⾃⼰创建下级类就会出现当下级类发⽣改变操作,⾃⼰也要跟着修改。而是采用谁调用整个类, 谁就把这个类的下级类对象给我.
此时,我们只需要将原来由⾃⼰创建的下级类,改为传递的⽅式(也就是注⼊的⽅式),因为我们不需要在当前类中创建下级类了,所以下级类即使发⽣变化(创建或减少参数),当前类本身也⽆需修改任何代码,这样就完成了程序的解耦

eg: 我们要调用Car类, Car类依赖Framework类, 此时我们不在Car类中创建Framework对象, 而在调用Car类时, 为Car提供一个Framework对象.

1.3.3 控制反转程序的编写

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;
        public Tire(int size){
            this.size = size;
        }
        public void init() {
            System.out.println("轮胎尺寸" + size);
        }
    }
}


代码经过以上调整,⽆论底层类如何变化,整个调⽤链是不⽤做任何改变的,这样就完成了代码之间的解耦,从⽽实现了更加灵活、通⽤的程序设计了
在这里插入图片描述
规律:
传统开发: Car 控制并创建了Framework,Framework 创建并创建了 Bottom,
也就是上级对象创建并控制下级对象
控制权反转开发: 下级对象的控制权不再由上级类控制, 而是把下级对象注入到上级对象中, 这样下级类就可以随意变化了. 这就是loC的实现思想

1.4 理解Spring loC

我们说Spring是一个loC(控制反转)容器, 也就是具有容器最基本的功能,

  • 将对象存到容器里
  • 将对象从容器里取出

故而学习Spring: 就是学如何将对象存⼊到 Spring 中,再从 Spring 中获取对象的过程

将对象存放到容器中的好处:将对象存储在 IoC 容器相当于将以后可能⽤的所有⼯具制作好都放到仓库中,需要的时候直接取就⾏了,⽤完再把它放到仓库。⽽ new 对象的⽅式相当于,每次需要⼯具了,才现做,⽤完就扔掉了也不会保存,下次再⽤的时候还得重新做,这就是 IoC 容器和普通程序开发的区别。

Spring中默认情况使用的是懒汉单例模式, 第一次使用时创建对象, 之后使用同一个对象, 提升了使用率和内存.

1.5 什么是DI

说到Spring就必要提到DI,DI 是 Dependency Injection 的缩写, 翻译就是"注入依赖".

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

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

比如: 今天想吃好吃的, 吃好吃的是一种大的思想(loC), 而具体吃什么, 是一种实现(也就是DI).

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

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

相关文章

一个非常实用的分布式 JVM 监控工具

介绍 该项目为了方便开发者更快监控多个远程主机jvm,如果你的项目是Spring boot那么很方便集成,jar包引入即可,不是Spring boot也不用气馁,你可以快速自行初始化一个Spirng boot程序引入jar包即可 效果展示 整体架构 git地址 ht…

Kafka由浅入深(6) Sender线程执行源码解析

一、KafkaProducer消息流程图 1.1 KafkaProducer 消息架构图 1.2 KafkaProducer 消息架构分为两部分 第一部分是KafkaProducer主线程 主要逻辑提供消息拦截器、序列化器、和分区器的默认实现和对外自定义扩展功能,已经将消息追加并缓存到累加器RecordAccumulator…

NeurIPS 2022 | 涨点神器!利用图像辅助三维点云分析的训练新范式

原文链接:https://www.techbeat.net/article-info?id4212 作者:颜旭 点云作为一种基本的三维表征形式,活跃在自动驾驶、机器人感知等多种任务上。尽管三维点云分析在近年来取得了良好的发展,但由于点云其本身往往是无序、无纹理以…

OpenCV笔记--人脸识别算法Eigenfaces和Fisherfaces

目录 1--前言 2--处理ORL数据集 3--Eigenfaces复现过程 4--Fisherfaces复现过程 5--分析 1--前言 ①SYSU模式识别课程作业 ②配置:基于Windows11、OpenCV4.5.5、VSCode、CMake(参考OpenCV配置方式) ③原理及源码介绍:Face…

云栖探馆!云小宝首秀遇上老司机小龙,猜猜谁赢了?

为啥人人都喜欢秋天呢?因为我们打喷嚏都是“爱秋”啊~ 为啥大家会来云栖大会呢?因为云栖大会让我们在一“栖”啊~ 2022云栖大会龙蜥峰会,小龙来啦~! ​ 去年,小龙作为萌新来到云栖大会&#…

归并排序.

归并排序介绍 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用金典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各个答案"修补"在一起,即分而治之) 归并排序的思想示…

为什么程序员会秃头?盘点程序员糟心的几大因素

程序员与脱发似乎存在某种必然的逻辑连接,程序员秃头已经成为大家心中的思维定势。 一提到程序员,难免会想起来java, c, python以及无休止的debug环节,不难想象经常会有程序员跳楼自杀的情况。因为实在是生存不易&…

L5W1作业1 手把手实现循环神经网络

欢迎来到课程5的第一个作业!在此作业中,你将使用numpy实现你的第一个循环神经网络。 循环神经网络(RNN)在解决自然语言处理和其他序列任务上非常有效,因为它们具有“记忆”,可以一次读取一个输入 x⟨t⟩x^…

C语言百日刷题第六天

C语言百日刷题第六天51.鸡兔同笼问题52.输出所有形如aabb的完全平方数53.3n1问题54.输出100~999的所有水仙花数55.韩信点兵56.倒三角形57.求子序列的和58.分数化小数59.开灯问题60.蛇形填数51.鸡兔同笼问题 分析:小学生数学问题。设鸡为a个,兔为b个&…

大数据技术基础实验十:Hive实验——新建Hive表

大数据技术基础实验十:Hive实验——新建Hive表 文章目录大数据技术基础实验十:Hive实验——新建Hive表一、前言二、实验目的三、实验要求四、实验原理五、实验步骤1、启动Hive2、创建表3、显示表4、显示表列5、更改表6、删除表或者列六、最后我想说一、前…

vue学习笔记——简单入门总结(三)

文章目录1.Vue的理解:1.1.mvvm模型:1.2.vue2的数据代理:1.3.vue2的生命周期:1.4.vue中的render函数:1.5. mixin混入:2.Vue组件间通信:2.0.props:2.1.全局事件总线:2.2.消…

WeMos Mini ESP32-S2FN4R2介绍

WeMos Mini ESP32-S2FN4R2介绍LOLIN S2 Mini V1.0.0 ESP32-S2 4MB FLASH 2MB PSRAM WIFI开发板 🌼功能介绍 基于 ESP32-S2FN4R2TYPE-C USB27个数字输入/输出引脚,所有引脚都支持中断/pwm/I2C/单线ADC、DAC、I2C、SPI、UART、USB OTG 📍 详细…

棋盘(马蹄集)

棋盘 难度&#xff1a;白银 0时间限制&#xff1a;1秒 巴占用内存&#xff1a;64M 求一个N*N棋盘中的方块总数。 格式 输入格式&#xff1a;输入整型N 输出格式&#xff1a;输出整型 CSDN盛溪的猫 #include<bits/stdc.h> using namespace std; int main(){ long n,sum1;…

Mybatis要点总结

一、了解orm框架 1.什么是ORM框架&#xff1a;对象关系映射&#xff08;Object Relational Mapping&#xff0c;简称ORM&#xff09;&#xff0c;该模式是为了解决面向对象与关系数据库互补匹配的现象的技术&#xff1b;orm框架是连接数据库的桥梁&#xff0c;主要提供了人持久…

大数据技术之Zookeeper总结Ⅰ

zookeeper总结目录1. Zookeeper 入门1.1 zookeeper概述1.2 Zookeeper特点1.3 ZooKeeper 数据模型的结构2. Zookeeper 本地安装2.1 本地模式安装2.2 配置参数解读3. Zookeeper 集群操作3.1 集群操作3.2 Zookeeper 集群启动停止脚本3.3 客户端命令行语法1. Zookeeper 入门 1.1 z…

数据结构七:七大排序

目录 1&#xff1a;排序的概率 2.插入排序 2.1&#xff1a;直接插入排序-----稳定 2.1.1&#xff1a;基本思想 2.2&#xff1a;希尔排序 2.2.1&#xff1a;概念&#xff1a; 3.选择排序 3.1&#xff1a;选择排序 3.1.1&#xff1a;概念 3.2:堆排序 4.交换排序 4.1&…

微信小程序自动化测试之路

1. 前言 在每次发布新版本之前、都需要回归核心功能、已确保上线后小程序也能按照预期运行. 目前这部分回归工作是由测试同事手工去验证测试用例、按照每周一版本的迭代节奏、回归就花了测试挺多时间的. 最近前端工作比较轻松、故在思考能否把这部分重复的工作交给程序自动来进…

【EhCache: 一款Java的进程内缓存框架】EhCache 是什么、代码实战 Demo

文章目录1 EhCache 是什么2 代码实战 DemoTestEH.javaehcache.xml1 EhCache 是什么 Ehcache 是一种开源的、基于标准的缓存&#xff0c;可提高性能、卸载数据库并简化可扩展性。它是最广泛使用的基于 Java 的缓存&#xff0c;因为它健壮、经过验证、功能齐全&#xff0c;并且与…

python 基于PHP+MySQL的装修网站的设计与实现

至今为止,越来越多企业公司都已经实现了线上推广,提高了企业的运营工作效率,为装修公司设计一款强大的智能装修网,集企业信息展示和信息管理于一体,结合企业与外部的在线交流功能,主要用于大力宣传企业服务、企业产品等信息,让更多的人了解,提高企业的知名度 1&#xff1a;系统…

Spring Data Neo4j(1.对象映射)

文章目录一、Spring Data Neo4j二、注释NodeIdVersion(乐观锁)PropertyRelationship一、Spring Data Neo4j Spring Data Neo4j或简称SDN是下一代Spring Data模块&#xff0c;由Neo4j&#xff0c;Inc.创建和维护。与VMware的Spring Data Team密切合作。 它支持所有官方支持的Ne…