什么是spring?

spring框架是一个轻量级的开源的JavaEE框架。

所谓轻量级则是:占用空间小,代码侵入性低,代码耦合度低,降低代码复杂度,可以轻易适配多种框架。

随着spring的不断发展,它所占用的空间也不断增大从而使得空间小的优势逐渐降低,但是spring依然遵守着尽可能降低占用空间的方式采用了按需加载的方式来管理jar包。并且spring的轻量级真正体现在代码的侵入性低和代码耦合第低的特点,相比于早期的ELB框架有着明显的优势。

由于在spring未出现之前,大量java开发者都会使用EJB框架来进行开发,这个框架是基于JavaEE进行封装的,对代码的侵入性很强并且操作起来也很复杂,下面给出详细对比。

特性EJB (传统 EJB 2.x 为代表)Spring FrameworkSpring 的优势/区别
编程模型侵入式、复杂非侵入式、简单
必须实现特定接口 (SessionBeanEntityBeanMessageDrivenBean),业务代码与 EJB API 紧密耦合。基于 POJO。业务类是普通 Java 类,无需实现特定框架接口或继承基类(注解配置为主)。更简单、更灵活、代码更干净、更容易理解和维护。
重量级 vs 轻量级重量级轻量级
严重依赖功能齐全的应用服务器 (Full J2EE App Server),启动慢,资源消耗大。核心容器小巧高效。可以运行在 Servlet 容器 (Tomcat, Jetty) 甚至 Java SE 环境中。Spring Boot 进一步简化了独立部署。启动更快、资源占用更少、部署选择更灵活(尤其适合云和微服务)。
依赖管理复杂、容器管理灵活、依赖注入 (DI)
依赖查找 (JNDI) 或通过 EJB 容器管理的注入机制 (后来加入)。配置相对复杂。核心特性是 IoC/DI。对象依赖关系通过容器外部配置 (XML, Java Config, 注解) 注入,而非硬编码创建。解耦更彻底、配置更清晰、测试更容易 (方便 Mock 依赖)。
服务提供方式容器提供框架集成或声明式
事务、安全、持久化、分布式等复杂服务由 EJB 容器提供和管理。开发者通过部署描述符 (ejb-jar.xml) 或注解配置。声明式服务:通过 AOP 和框架集成提供。
事务管理: @Transactional 注解或 XML 配置。
安全: Spring Security (独立模块)。
持久化: 集成 JPA/Hibernate/MyBatis 等,提供 JpaTemplate/HibernateTemplate (简化版) 或直接使用标准 JPA。
远程调用: 支持多种方式 (RMI, Hessian, HTTP Invoker),但不强制分布式。
更灵活、更透明、非强制。可以选择需要的服务,按需引入模块。避免容器“黑魔法”。
测试非常困难非常容易
严重依赖 EJB 容器环境,需要启动整个应用服务器或在模拟容器中进行,速度慢,复杂度高。核心是 POJO + DI,业务逻辑可以在容器外轻松进行单元测试。Spring 提供强大的 spring-test 模块支持集成测试(加载部分或完整上下文)。大幅提升开发效率和代码质量。TDD/BDD 友好。
学习曲线陡峭相对平缓
需要深入理解复杂的 EJB 规范、部署描述符、容器行为和各种服务。核心概念 (IoC, DI, AOP) 清晰,易于上手。丰富的文档和社区支持。更容易被开发者接受和掌握。
可移植性理论高,实际受限
遵循 J2EE 标准,理论上可在不同应用服务器间移植。但实际中常遇到厂商特定行为或扩展的兼容性问题。不绑定特定容器或服务器。核心代码是 POJO,配置是 Spring 的,可以在支持 Servlet 规范或 Java SE 的任何环境运行。真正的“一次编写,到处运行”(在支持Java的环境)。
模块化较弱 (早期)
EJB 规范本身是一个整体,应用服务器通常全量提供。高度模块化设计。开发者只需引入项目实际需要的模块 (如 spring-corespring-contextspring-jdbcspring-webmvc)。Spring Boot 的 Starter 进一步简化依赖管理。减少不必要的依赖和资源开销,应用更轻量。
事务管理CMT (容器管理事务) 为主声明式事务为主
通过容器提供声明式事务 (@TransactionAttribute 或 XML)。功能强大,但控制相对黑盒。强大的、灵活的声明式事务管理 (@Transactional)。也支持编程式事务。底层可适配不同事务管理器 (JDBC, JTA, Hibernate 等)。配置更直观,行为更透明,易于理解和定制。同样强大,且不绑定 JTA (在单数据源场景可用更轻量的资源本地事务)。
持久化Entity Beans (CMP/BMP - 复杂且低效)集成 ORM 框架
EJB 2.x Entity Beans (尤其是 CMP) 设计复杂,性能差,难以使用。EJB 3.0 引入了 JPA (借鉴了 Hibernate 等 ORM 思想)。不发明轮子,拥抱最佳实践完美集成 JPA (Hibernate, EclipseLink 等) 和 MyBatis 等流行持久化框架。提供 JdbcTemplate 简化 JDBC。开发者可以使用成熟、高效、社区活跃的 ORM 框架,避免了 Entity Bean 的缺陷。
分布式能力核心设计目标 (RMI-IIOP)不强制,按需选择
天生为分布式设计 (RMI-IIOP 通信),但分布式本身带来复杂性和性能开销。不强制分布式。鼓励将应用拆分为合适的粒度。需要分布式时,可选用多种技术 (Spring Cloud, REST, gRPC, 消息队列等)。更符合“简单设计”原则。大多数应用不需要重量级的分布式通信。微服务时代有更现代的选择。

经过上述对比我们发现EJB就像是古代打仗时候的重骑兵一样,相较于EJB则spring更加像是一个轻骑兵,用起来更加方便。

Spring家族:

上图则是spring框架的总体功能,可以看到spring的核心是在Core当中,也就是树的根。这个Core种含有IOC容器和一些Framework工具类。因此我们可以看出整个spring架构种的核心其实就是IOC容器,如果没有IOC容器的支持整个spring的其他功能都无法正常运行。

spring家族目前有以下几大类

  • Spring Framework 是地基。

  • Spring Boot 是快速构建独立应用的加速器。

  • Spring Data 统一数据访问。

  • Spring Security 保障安全。

  • Spring Cloud 构建和管理分布式微服务系统。

  • 其他组件 (Integration, Batch, Session, GraphQL, HATEOAS, Shell, Kafka/AMQP, Vault, Statemachine) 解决特定领域的复杂问题。

spring的特点:

方便解耦,简化开发

AOP编程支持

方便程序测试

方便和其他框架整合

方便进行事务操作

降低API开发的难度

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Visual Studio Code自用搜索技巧整理

多文件跨行搜索 用途 在多个日志文件中搜索跨行日志 方法 1.用VS Code打开待搜索文件所在的目录; 2.按快捷键(CtrlShiftF)打开全局搜索; 3.点击搜索框右侧的开启正则表达式; 4.输入正则表达式,例如&…

Axure PR 9 验证码登录 案例

大家好,我是大明同学。 这期内容,我们来用Axure来制作一个短信验证登录页面的小案例。 验证码登录小案例 创建手机号输入框所需的元件 1.打开一个新的 RP 文件并在画布上打开 Page 1。 2.在元件库中拖出一个矩形元件,选中矩形元件&#xf…

监听器模式

1. 问题背景 假设我们有一个 银行账户管理系统,该系统需要监控用户账户余额的变动,并在发生变动时,自动执行一些相关的操作,比如发送 余额变动通知(如短信、邮件等)。为了实现这一功能,我们希望…

帕鲁杯应急响应赛题:知攻善防实验室

一、背景信息 在这个跳跃的数字舞台上,数据安全成了政企单位稳航的重要压舱石。某政企单位,作为一艘驶向未来 的巨轮,对数据的把控丝毫不敢松懈。眼下,我们即将启航一场无与伦比的探险——“信息安全探索之 旅”。 这趟旅程的目的…

【硬核数学】2.2 深度学习的“微积分引擎”:自动微分与反向传播《从零构建机器学习、深度学习到LLM的数学认知》

欢迎来到本系列的第七篇文章。在上一章,我们用张量武装了我们的线性代数知识,学会了如何描述和操作神经网络中的高维数据流。我们知道,一个神经网络的“前向传播”过程,就是输入张量经过一系列复杂的张量运算(矩阵乘法…

DAY 45 Tensorboard使用介绍

浙大疏锦行https://blog.csdn.net/weixin_45655710知识点回顾: tensorboard的发展历史和原理tensorboard的常见操作tensorboard在cifar上的实战:MLP和CNN模型 作业:对resnet18在cifar10上采用微调策略下,用tensorboard监控训练过程…

2023年全国硕士研究生招生考试英语(一)试题总结

文章目录 题型与分值分布完形填空错误 1:考察连词 or 前后内容之间的逻辑关系错误2:错误3:错误4:这个错得最有价值,因为压根没读懂错误5:学到的短语: 仔细阅读排序/新题型翻译小作文大作文 题型…

react-数据Mock实现——json-server

什么是mock? 在前后端分离的开发模式下,前端可以在没有实际后端接口的支持下先进行接口数据的模拟,进行正常的业务功能开发 json-server实现数据Mock json-server是一个node的包,可以在不到30秒内获得零编码的完整Mock服务 实现…

使用POI导入解析excel文件

首先校验 /*** 校验导入文件* param file 上传的文件* return 校验结果,成功返回包含成功状态的AjaxResult,失败返回包含错误信息的AjaxResult*/private AjaxResult validateImportFile(MultipartFile file) {if (file.isEmpty()) {return AjaxResult.er…

从0开始学习计算机视觉--Day06--反向传播算法

尽管解析梯度可以让我们省去巨大的计算量,但如果函数比较复杂,对这个损失函数进行微分计算会变得很困难。我们通常会用反向传播技术来递归地调用链式法则来计算向量每一个方向上的梯度。具体来说,我们将整个计算过程的输入与输入具体化&#…

企业流程知识:《学习观察:通过价值流图创造价值、消除浪费》读书笔记

《学习观察:通过价值流图创造价值、消除浪费》读书笔记 作者:迈克鲁斯(Mike Rother),约翰舒克(John Shook) 出版时间:1999年 历史地位:精益生产可视化工具的黄金标准&am…

Day02_C语言IO进程线程

01.思维导图 02.将当前的时间写入到time. txt的文件中,如果ctrlc退出之后,在再次执行支持断点续写 1.2022-04-26 19:10:20 2.2022-04-26 19:10:21 3.2022-04-26 19:10:22 //按下ctrlc停止,再次执行程序 4.2022-04-26 20:00:00 5.2022-04-26 2…

FFmpeg中TS与MP4格式的extradata差异详解

在视频处理中,extradata是存储解码器初始化参数的核心元数据,直接影响视频能否正确解码。本文深入解析TS和MP4格式中extradata的结构差异、存储逻辑及FFmpeg处理方案。 📌 一、extradata的核心作用 extradata是解码必需的参数集合&#xff0…

【CV数据集介绍-40】Cityscapes 数据集:助力自动驾驶的语义分割神器

🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

SAP月结问题9-FAGLL03H与损益表中研发费用金额不一致(FAGLL03H Bug)

SAP月结问题9-FAGLL03H与损益表中研发费用金额不一致(S4 1709) 财务反馈,月结后核对数据时发现FAGLL03H导出的研发费用与损益表中的研发费用不一致,如下图所示: 对比FAGLL03H与损益表对应的明细,发现FAGLL03H与损益表数据存在倍数…

HTML inputmode 属性详解

inputmode 是一个 HTML 属性&#xff0c;用于指定用户在编辑元素或其内容时应使用的虚拟键盘布局类型。它主要影响移动设备和平板电脑的输入体验。 语法 <input inputmode"value"> <!-- 或 --> <textarea inputmode"value"></texta…

软考中级【网络工程师】第6版教材 第1章 计算机网络概述

考点分析&#xff1a; 本章重要程度&#xff1a;一般&#xff0c;为后续章节做铺垫&#xff0c;有总体认识即可&#xff0c;选择题1-2分高频考点&#xff1a;OSI模型、TCP/IP模型、每个层次的功能、协议层次新教材变化&#xff1a;删除网络结构、删除X.25、更新互联网发展【基本…

Mysql事务与锁

数据库并发事务 数据库一般都会并发执行多个事务&#xff0c;多个事务可能会并发的对相同的一批数据进行增删改查操作&#xff0c;可能就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。为了解决这些并发事务的问题&#xff0c;数据库设计了事务隔离机制、锁机制、MVCC多…

Bilibili多语言字幕翻译扩展:基于上下文的实时翻译方案设计

Bilibili多语言字幕翻译扩展&#xff1a;基于上下文的实时翻译方案设计 本文介绍了一个Chrome扩展的设计与实现&#xff0c;该扩展可以为Bilibili视频提供实时多语言字幕翻译功能。重点讨论了字幕翻译中的上下文问题及其解决方案。 该项目已经登陆Chrome Extension Store: http…

热血三国野地名将列表

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>野地名将信息表</title><style>tabl…