Spring 是什么

news2024/11/10 12:19:42

首先我们先看一个例子。以下是代码的结构。

public interface UserDAO {
    /**
     * 根据id删除用户
     */
    void deleteById();
}
public class UserDAOImplForMySQL implements UserDAO {
    @Override
    public void deleteById() {
        System.out.println("使用MySQL数据库删除信息....");
    }
}
public interface UserService{
    /**
     * 删除用户信息
     */
    void deleteUser();
}
public class UserServiceImpl implements UserService {
    private UserDAO userDAO = new UserDAOImplForMySQL();
    @Override
    public void deleteUser() {
        userDAO.deleteById();
    }
}
public class UserAction {
    private UserService userService = new UserServiceImpl();

    /**
     * 删除用户信息的请求
     */
    public void deleteRequest() {
        userService.deleteUser();
    }

}
public class UserTest {
    @Test
    public void test() {
        UserAction userAction = new UserAction();
        userAction.deleteRequest();
    }
}

以上代码代码现在看起来没有什么问题对吧。

好的。现在我有一个新的需求:我想要使用付费的 Oracle。

此时怎么做呢?当然就是新建一个 Oracle 的实现类了

public class UserDAOImplForOracle implements UserDAO {
    @Override
    public void deleteById() {
        System.out.println("使用Oracle数据库删除信息....");
    }
}

此时,直接执行还是使用的 MySQL。我们需要去改变之前写好的代码,才可以实现这个需求。

public class UserServiceImpl implements UserService {
    private UserDAO userDAO = new UserDAOImplForOracle();
    @Override
    public void deleteUser() {
        userDAO.deleteById();
    }
}

这违背了软件开发原则中的 开闭原则依赖倒置原则

以下先分别介绍这两种原则。

开闭原则(OCP)

  • OCP 开闭原则是软件七大开发原则当中最基本的一个原则。
  • OCP 开闭原则:
    • 在软件开发过程中应当对扩展开放,对修改关闭。
    • 在软件开发过程中,通过添加额外的类对原先程序已有的功能进行扩展是没问题的,但是如果因为要进行功能扩展而修改之前运行正常的程序,这是不被允许的。
    • 因为一旦修改之前运行正常的程序,那么项目整体就要进行重新测试,这会导致额外的开销和资源消耗,并且测试过程相当麻烦。
  • OCP 开闭原则是最核心的、最基本的,其他的六个开发原则都是为这个原则服务的。
  • 是否违反 OCP 开闭原则的判断:
    • 只要你在扩展系统功能的时候,没有修改以前写好的代码,那么你就是符合 OCP 原则的。
    • 反之,如果在扩展系统功能的时候,你修改了之前的代码,那么这个设计是失败的,违背了OCP原则。

依赖倒置原则(DIP)

  • 依赖倒置原则,就是不再显示的建立类之间的关联关系,而是面向接口编程,面向抽象编程,不要面向具体编程,从而降低程序的耦合度,提高程序的扩展力,增强代码复用性。
  • 依赖倒置原则的目的:降低程序的耦合度,提高程序的扩展力,增强代码复用性。
  • 是否符合依赖倒置原则:
    • 上 不依赖 下,就是符合,即类的实例对象之间没有明确固定在代码中的依赖关系。
    • 上 依赖 下,就是违背。只要“下”一改动,“上”就受到牵连。
  • 符合依赖倒置原则的编程思想:控制反转

控制反转(IoC)

  • 当前程序的设计,显然既违背OCP,又违背DIP,可以采用“控制反转”这种编程思想来解决这个问题。
  • 控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计思想,可以用来降低代码之间的耦合度,符合依赖倒置原则。
    • 由于控制反转思想出现的比较新,所以没有被纳入GoF23种设计模式范围内。
  • 控制反转的核心思想:
    • 将对象的创建权交出去。
    • 将对象和对象之间关系的管理权交出去。
    • 对象的创建和对象之间关系的维护都由第三方容器来负责。
  • 控制反转中的反转是两件事:
    • 第一件事:不在程序中采用硬编码的方式来new对象了,将new对象的权利交出去。
    • 第二件事:不在程序中采用硬编码的方式来维护对象的关系了,对象之间关系的维护权交出去了。
  • 控制反转思想的实现:依赖注入

依赖注入(DI)

  • 控制反转的实现方式有多种,其中比较重要的叫做:依赖注入(Dependency Injection,简称DI)。
  • 依赖注入,用于实现对象之间关系的建立
  • 控制反转是思想。依赖注入是这种思想的具体实现。
  • 依赖注入DI,又包括常见的两种方式:
    • 第一种:set注入(执行set方法给属性赋值)
    • 第二种:构造方法注入(执行构造方法给属性赋值)
  • 依赖注入 中 “依赖”是什么意思? “注入”是什么意思?
    • 依赖:A对象和B对象的关系。
    • 注入:是一种手段,通过这种手段,可以让A对象和B对象产生关系。
  • 依赖注入:对象A和对象B之间的关系,靠注入的手段来维护。而注入包括:set注入和构造注入。

术语小结

  • OCP:开闭原则(开发原则)
  • DIP:依赖倒置原则(开发原则)
  • IoC:控制反转(一种思想,一种新型的设计模式)
  • DI:依赖注入(控制反转思想的具体实现方式)

什么是Spring

Spring 框架实现了控制反转IoC这种思想。

  • Spring框架可以帮你new对象。
  • Spring框架可以帮你维护对象和对象之间的关系。

Spring是一个实现了IoC思想的容器。

当然,Spring 不止实现了IoC,还有以下的特性。

  • Spring是一个开源框架。
  • Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
    • Spring实现了控制反转思想,Spring框架可以帮你维护对象和对象之间的关系
    • Spring实现了面向切面编程
    • 由于我们可以将创建对象交给Spring负责,所以Spring也是一个存放对象的容器
  • Spring为简化开发而生,让程序员只需关注核心业务的实现,尽可能的不再关注非业务逻辑代码(事务控制,安全日志等),这得益于AOP。

Spring 8大模块

  • Spring5版本之后是8个模块。在Spring5中新增了WebFlux模块。

Spring 的特点

  1. 轻量
    1. 完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布,并且Spring所需的处理开销也是微不足道的。
    2. Spring是非侵入式的:spring框架的运行不需要依赖其他框架
  1. 控制反转
    1. Spring实现了控制反转思想
  1. 面向切面
    1. Spring提供了面向切面编程的丰富支持
    2. 允许开发者只需专注于业务逻辑的开发,与核心业务无关的代码可以以切面的方式加入核心业务代码的执行过程中,将核心业务的执行流程看成是纵向执行的,与核心业务无关的代码(如事务、日志等)可以以横向切面的方式加入核心业务的执行过程中
  1. 容器
    1. Spring 可以包含并管理应用对象的配置和生命周期,即Spring可以负责对象的创建到对象的销毁这整个生命周期过程中对象的维护和管理,Spring就好比一个存放和管理对象的容器
  1. 框架
    1. Spring可以将简单的组件配置、组合成为复杂的应用。

 Spring 对 JDK 的要求

  • Spring6要求JDK最低版本是Java17

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

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

相关文章

day49 | 42. 接雨水 84. 柱状图中最大的矩形

代码随想录算法训练营第 49 天| 42. 接雨水 84. 柱状图中最大的矩形 Leetcode 42. 接雨水 题目链接:https://leetcode.cn/problems/trapping-rain-water/description/ 题目描述: 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按…

【第三期实战营闯关作业##LMDeploy 量化部署进阶实践】

《LMDeploy 量化部署进阶实践》这节课内容有些多,因此分了两部分提交了。以下是记录复现过程及截图; 这是执行了下面的命令,占用显存的情况。(如截图顶部) lmdeploy chat /root/models/internlm2_5-7b-chat --cache-max-entry-co…

视觉检索(以图搜图)技术分享

视觉检索(Visual Retrieval)是一个涉及计算机视觉和图像处理的技术领域,主要目标是从大量的视觉数据中找到与查询图像或视频相关的内容。视觉检索技术在多个领域都有广泛应用,如医疗图像分析、安全监控、机器人视觉、电子商务等。…

《高等代数》“爪”字型行列式

说明:此文章用于本人复习巩固,如果也能帮助到大家那就更加有意义了。 注:1)“爪”字型行列式的第一种求解方法是利用初等行(列)变换,将第一列除第一行的第 一个数以外的其它数…

浅谈常见的分布式ID生成方案

一、UUID UUID是通用唯一标识码的缩写,其目的是让分布式系统中的所有元素都有唯一的辨识信息,而不需要通过中央控制器来指定唯一标识。 优点: (1)降低全局节点的压力,使得主键生成速度更快; &…

Llamaindex RAG实践

加入xtunert文档作为提示词 让大模型理解xtuner

【C++ Primer Plus习题】7.8

问题: 解答: #include <iostream> using namespace std;#define SEASONS 4typedef struct _Spend {double money[SEASONS]; }Spend;const char* Snames[SEASONS] { "Spring","Summer","Fall","Winter" };void fill(double* ex…

vue2表格显隐列的封装【升级缓存版】

背景 我们知道&#xff0c;若依后台有列表页、表格字段有显隐列的功能&#xff0c;但是&#xff0c;页面一旦刷新&#xff0c;就又回到初始状态了&#xff0c;但是有时候我们想要刷新后也保留我们设置的显隐列&#xff0c;就需要自己封装了 若依显隐列示例图如下&#xff1a; …

RK3568笔记五十八:基于SIP的视频通话测试

若该文为原创文章,转载请注明原文出处。 一、简介 记录SIP的视频通话测试过程,以前有做过GB28181了解过SIP协议,后面由于一些原因,没有在做了,在安防领域上,有很多终端设备使用SIP协议实现视频对讲等功能。 此篇记录交叉编译eXosip和osip,并编写检测的SIP客户端,通过…

【kubernetes】kubernetes Deployment 详解

Deployment 详解 kubernetes Deployment 详解创建与删除kubernetes Deployment更新/回滚/缩放/暂停/恢复部署操作 发布策略1、在zs命名空间下创建3个httpd副本并查看结果2、尝试删除其中一个副本并查看结果3、删除所有副本并查看结果4、使用k8s做金丝雀发布测试 kubernetes Dep…

teamtalk最近联系会话

最近联系人相关信令和协议设计 enum BuddyListCmdID {CID_BUDDY_LIST_RECENT_CONTACT_SESSION_REQUEST 513,CID_BUDDY_LIST_RECENT_CONTACT_SESSION_RESPONSE 514,};流程图 根据最新的时间戳查找最新的会话更新客户端的会话时间 /*** 获取最近会话接口** param pPdu …

Java数据结构(七)——优先级队列与PriorityQueue

文章目录 优先级队列与PriorityQueue堆基本概念和性质建堆堆的插入堆的删除堆的应用 PriorityQueuePriorityQueue的构造方法PriorityQueue的常用方法PriorityQueue的模拟实现 经典TopK问题 优先级队列与PriorityQueue 优先级队列是一种特殊类型的队列&#xff0c;其中元素按照…

聊聊 OceanBase 内存管理

内存配置管理是数据库日常管理中非常重要的工作&#xff0c;正确合理配置数据库内存是保障系统高效运行的前提条件。 OceanBase 数据库是一个支持多租户架构的准内存级的分布式数据库&#xff0c;对大容量内存的管理和使用提出了很高的要求。实际使用上&#xff0c;OceanBase …

1.【R语言】R语言的下载和安装

R语言是一种开源编程语言&#xff0c;它提供了丰富的统计模型和图形绘制功能&#xff0c;广泛用于数据科学、统计分析、数据挖掘和机器学习。R有一个活跃的社区和大量的包&#xff0c;可以满足各种需求&#xff0c;如数据清洗、绘图和报告生成。其强大的数据处理能力和灵活的可…

【ESP-IDF FreeRTOS】队列管理

先包含下头文件。 #include "freertos/queue.h" 队列大家应该不陌生&#xff0c;就是一个先进先出的容器。用在FreeRTOS里用途就多了。 首先是可以让任务与任务之间以及中断之间通信&#xff0c;任务A把数据塞进队列再让任务B取出&#xff0c;这样就可以传递数据了…

BMC lighttpd kvm数据分析(websocket)

1.说明 lighttpd源码: https://github.com/lighttpd/lighttpd1.4.gitlighttpd wiki: https://redmine.lighttpd.net/projects/lighttpd/wiki/libfcgi: https://github.com/toshic/libfcgi/tree/master 注意: 本章的代码仓库: https://gitee.com/wit_yuan/lighttpd_kvm 2.编…

3127.构造相同颜色的正方形

1.题目描述 给你一个二维 3 x 3 的矩阵 grid &#xff0c;每个格子都是一个字符&#xff0c;要么是 B &#xff0c;要么是 W 。字符 W 表示白色&#xff0c;字符 B 表示黑色。 你的任务是改变 至多一个 格子的颜色&#xff0c;使得矩阵中存在一个 2 x 2 颜色完全相同的正方形。…

无敌美少男和无敌美少女构建企业级私有仓库(harbor)

一&#xff1a;harbor简介 Harbor 是由 vmware 公司开源的企业级 Docker Registry 项目。 它提供了以下主要功能和特点&#xff1a; 基于角色的访问控制&#xff08;RBAC&#xff09;&#xff1a;可以为不同的用户和用户组分配不同的权限&#xff0c;增强了安全性和管理的灵…

Linux下的MySQL8.0报错:[Err]1055

Linux下的MySQL8.0报错&#xff1a;[Err]1055 报错信息解决办法 报错信息 在Linux环境下的MySQL里执行SQL语句报如下错误&#xff1a;[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column information_schema.PROFIL…

maven 父子工程创建详解

maven 父子工程创建详解 一、Maven工程继承关系 继承概念 maven继承是指的Maven的项目中&#xff0c;让一个项目从另外项目中继承配置信息的机制。继承可以让我们在多个项目中共享同一个配置信息&#xff0c;简化项目的管理和维护工作 继承作用&#xff1a;在父工程中统一管理…