SSM 框架核心知识详解(Spring + SpringMVC + MyBatis)
🌱 第一部分:Spring 核心原理与使用
1. 什么是 Spring
Spring 是一个开源的 Java 企业级开发框架,旨在简化 Java 企业应用程序开发。它核心思想是控制反转(IoC)和面向切面编程(AOP),使开发者能更轻松地创建松耦合、可测试和易维护的应用程序。
它提供了对 Bean 的生命周期管理、依赖注入、声明式事务管理、AOP 支持等功能,并与多种其他框架(如 Hibernate、MyBatis、Struts)高度兼容,形成了完整的企业级应用解决方案。
2. 什么是 SpringMVC
SpringMVC 是 Spring 框架中的一个模块,是一个基于 Servlet 的 Web 框架,遵循 MVC(Model-View-Controller)设计模式。它用于构建 Web 应用的表现层,负责处理请求和返回响应,核心处理器是 DispatcherServlet
,它协调整个请求流程。
3. 什么是 MyBatis
MyBatis 是一款持久层框架,通过 XML 或注解将 SQL 语句和 Java 方法关联起来,使开发者能够直接控制 SQL 的执行过程和映射规则,具有灵活、高效的特点。
它避免了 Hibernate 的全自动 ORM 的复杂性,允许开发者编写原生 SQL,使 SQL 更加可控、易调试。
4. Spring 的核心
-
IoC 容器:管理对象的生命周期与依赖关系。
-
AOP 支持:通过切面简化日志、安全、事务等横切关注点。
-
容器配置方式多样:支持 XML、注解、Java 配置类。
-
事务管理:声明式和编程式事务支持。
-
模块化架构:包括 Beans、Context、Core、AOP、JDBC 等模块。
5. Spring 的优点
-
解耦合:IoC 机制有效降低模块间耦合。
-
高扩展性:提供大量扩展点与标准接口。
-
易测试:可通过依赖注入替换真实对象。
-
广泛整合:与主流框架、库无缝集成。
-
轻量级:按需加载模块,避免臃肿。
6. @Autowired
与 @Resource
区别
特性 | @Autowired | @Resource |
---|---|---|
所属标准 | Spring | JSR-250 标准 |
注入方式 | 默认按类型(可配合 @Qualifier ) | 默认按名称(可使用 name 属性) |
适用范围 | Spring 内部推荐 | Java 通用注解 |
依赖检查 | 可设置 required=false | 不支持 |
7. Spring 的生命周期(Bean 生命周期)
-
加载 Bean 的定义信息(XML、注解、JavaConfig)
-
实例化 Bean(反射)
-
设置属性(依赖注入)
-
PostProcessor
后置处理 -
Bean 准备就绪使用
-
容器销毁时调用销毁方法(如
@PreDestroy
或 destroy-method)
8. 依赖注入的方式
-
构造器注入:通过构造方法传入依赖(推荐用于不可变对象)。
-
Setter 注入:通过属性 setter 方法注入。
-
字段注入:使用
@Autowired
注解直接注入(不推荐用于测试)。
9. Spring 中 Bean 是单例的吗?
默认是单例(singleton)。Spring 容器中 Bean 默认作用域是单例,也可配置为:
-
prototype
:每次获取都新建实例。 -
request
:每个 HTTP 请求一个实例(Web 项目)。 -
session
:每个会话一个实例。 -
application
:每个 ServletContext 一个实例。 -
websocket
:每个 WebSocket 一个实例。
10. 四大注解区别
注解 | 描述 | 所在层次 |
---|---|---|
@Component | 标识为普通组件(通用) | 任意层 |
@Controller | 标识控制层组件(处理请求) | 表现层 |
@Service | 标识服务层组件(业务逻辑) | 业务逻辑层 |
@Repository | 标识持久层组件(数据访问) | DAO 层 |
11. 控制反转与依赖注入
-
控制反转(IoC):将对象创建和管理的控制权交给容器,程序不再主动创建对象,而是由容器注入。
-
依赖注入(DI):容器在创建对象时,将它依赖的资源注入进来。
区别:IoC 是一种思想,DI 是实现 IoC 的技术手段。
🔁 第二部分:AOP 与常用注解
12. Spring AOP 术语
-
Aspect(切面):定义横切逻辑的模块。
-
JoinPoint(连接点):程序执行过程中可插入切面的点,如方法调用。
-
Pointcut(切入点):定义哪些 JoinPoint 被织入。
-
Advice(通知):切面在连接点执行的动作(如前置、后置)。
-
Weaving(织入):将切面逻辑加入到目标对象的过程。
13. 通知的类型
-
@Before
:方法前执行 -
@After
:方法后执行(无论成功或异常) -
@AfterReturning
:方法成功返回后执行 -
@AfterThrowing
:方法抛出异常后执行 -
@Around
:环绕整个方法执行(最强大)
14. 注解作用说明
-
@Configuration
:标识配置类,等价于 XML 配置文件 -
@Bean
:定义 Bean 方法,注册到容器中 -
@Controller
:标识控制器类,用于处理请求 -
@Value
:注入配置文件中的值
🌐 第三部分:SpringMVC 深入
15. MVC 模式
MVC 是一种设计模式:
-
Model:数据模型(如实体类、Service)
-
View:视图(如 JSP、Thymeleaf、HTML)
-
Controller:控制器,处理请求、调用服务、返回视图
16. SpringMVC 工作原理
-
用户请求由前端控制器
DispatcherServlet
接收 -
查找 HandlerMapping 获取对应 Controller
-
由 HandlerAdapter 调用处理器方法
-
方法执行返回
ModelAndView
-
视图解析器解析视图名
-
响应渲染返回给用户
17. SpringMVC 优点
-
请求处理流程清晰、可扩展性强
-
注解简化配置
-
支持 RESTful URL
-
与 Spring 紧密集成
18. 常用注解作用
-
@RequestMapping
:映射 URL 到方法 -
@ResponseBody
:返回 JSON 或 XML -
@PathVariable
:获取路径参数 -
@RequestParam
:获取请求参数
💾 第四部分:MyBatis 专项
19. BeanFactory vs ApplicationContext
特性 | BeanFactory | ApplicationContext |
---|---|---|
加载方式 | 延迟加载 | 预加载单例 Bean |
国际化支持 | 无 | 有 |
事件机制 | 不支持 | 支持 |
推荐使用场景 | 轻量应用 | 企业级开发推荐 |
20. 数据库事务的 ACID 特性
-
原子性(Atomicity):操作要么全部成功,要么全部失败。
-
一致性(Consistency):事务执行前后,数据保持一致。
-
隔离性(Isolation):并发事务之间互不干扰。
-
持久性(Durability):事务提交后修改永久保存。
21. MyBatis 优点
-
SQL 可控,便于优化
-
映射灵活,可自定义规则
-
轻量,易与 Spring 集成
-
支持动态 SQL
22. 常用标签说明
-
<select>
:查询语句 -
<insert>
:插入语句 -
<update>
:更新语句 -
<delete>
:删除语句 -
<resultMap>
:复杂结果映射 -
<if>
、<where>
、<foreach>
:动态 SQL 控制
23. #{}
与 ${}
区别
表达式 | 描述 | 安全性 |
---|---|---|
#{} | 占位符,预编译传参 | 安全(防 SQL 注入) |
${} | 直接拼接字符串 | 不安全(易被注入) |
24. 实现模糊查询的方式
<!-- XML 映射方式 -->
<select id="findByName" resultType="User">SELECT * FROM user WHERE name LIKE CONCAT('%', #{name}, '%')
</select>
// Mapper 接口方式
List<User> findByName(String name);
相关文章:
SSM 框架核心知识详解(Spring + SpringMVC + MyBatis)
🌱 第一部分:Spring 核心原理与使用 1. 什么是 Spring Spring 是一个开源的 Java 企业级开发框架,旨在简化 Java 企业应用程序开发。它核心思想是控制反转(IoC)和面向切面编程(AOP)࿰…...
1.2 fetch详解
浏览器 Fetch API 详解 Fetch API 是现代浏览器提供的用于发起网络请求的接口,它基于 Promise 实现,替代了传统的 XMLHttpRequest,提供了更强大、更灵活的功能。 1. 基本用法 使用 fetch() 函数发起请求,返回一个 Promise&…...

【C#】Quartz.NET怎么动态调用方法,并且根据指定时间周期执行,动态配置类何方法以及Cron表达式,有请DeepSeek
🌹欢迎来到《小5讲堂》🌹 🌹这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解。🌹 🌹温馨提示:博主能力有限,理解水平有限,若有不对之处望指正!&#…...

02 Deep learning神经网络的编程基础 逻辑回归--吴恩达
逻辑回归 逻辑回归是一种用于解决二分类任务(如预测是否是猫咪等)的统计学习方法。尽管名称中包含“回归”,但其本质是通过线性回归的变体输出概率值,并使用Sigmoid函数将线性结果映射到[0,1]区间。 以猫咪预测为例 假设单个样…...
Android Native 内存泄漏检测全解析:从原理到工具的深度实践
引言 Android应用的内存泄漏不仅发生在Java/Kotlin层,Native(C/C)层的泄漏同样普遍且隐蔽。由于Native内存不受Java虚拟机(JVM)管理,泄漏的内存无法通过GC自动回收,长期积累会导致应用内存占用…...
React---扩展补充
一些额外的扩展 4.3 高阶组件 高阶组件是参数为组件,返回值为新组件的函数; 高阶组件 本身不是一个组件,而是一个函数;其次,这个函数的参数是一个组件,返回值也是一个组件; import React fr…...
HTML 中 class 属性介绍、用法
1、🔖 什么是 class class 是 HTML 元素的一个核心属性,用来为元素指定一个或多个类名。它在网页开发中承担三大作用: 🎨 连接样式(CSS):让元素应用预定义的视觉效果⚙️ 绑定行为(…...

MySQL的并发事务问题及事务隔离级别
一、并发事务问题 1). 赃读:一个事务读到另外一个事务还没有提交的数据。 比如 B 读取到了 A 未提交的数据。 2). 不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。 事务 A 两次读取同一条记录&…...

ProfiNet 分布式 IO 在某污水处理厂的应用
随着城市化进程的加速,污水处理厂的规模和复杂性不断增加,对自动化控制系统的要求也越来越高。PROfinet 分布式 IO 作为一种先进的工业通信技术,以其高速、可靠、灵活的特性,为污水处理厂的自动化升级提供了有力支持。本文将结合某…...
vue2使用笔记、vue2和vue3的区别
文章目录 vue2和vue3的区别1. 实现数据响应式的原理不同2. 生命周期不同3. vue 2.0 采用了 option 选项式 API,vue 3.0 采用了 composition 组合式 API4. 新特性编译宏5. 父子组件间双向数据绑定 v-model 不同6. v-for 和 v-if 优先级不同7. 使用的 diff 算法不同8.…...
Vue2数组数字字段求和技巧 数字求和方法
<template><div><p>总和: {{ totalSum }}</p></div> </template><script> export default {data() {return {items: [{ id: 1, value: 10 },{ id: 2, value: 20 },{ id: 3, value: 30 }]};},computed: {totalSum() {return this.ite…...

vue2 , el-select 多选树结构,可重名
人家antd都支持,elementplus 也支持,vue2的没有,很烦。 网上其实可以搜到各种的,不过大部分不支持重名,在删除的时候可能会删错,比如树结构1F的1楼啊,2F的1楼啊这种同时勾选的情况。。 可以全…...

Excel处理控件Aspose.Cells教程:使用 C# 从 Excel 进行邮件合并
邮件合并功能让您能够轻松批量创建个性化文档,例如信函、电子邮件、发票或证书。您可以从模板入手,并使用电子表格中的数据进行填充。Excel 文件中的每一行都会生成一个新文档,并在正确的位置包含正确的详细信息。这是一种自动化重复性任务&a…...
Jenkins | Jenkins构建成功服务进程关闭问题
Jenkins构建成功服务进程关闭问题 1. 原因2. 解决 1. 原因 Jenkins 默认会在构建结束时终止所有由构建任务启动的子进程,即使使用了nohup或后台运行符号&。 2. 解决 在启动脚本中加上 BULID_IDdontkillme #--------------解决jenkins 自动关闭进程问题-----…...
模块化架构下的前端调试体系建设:WebDebugX 与多工具协同的工程实践
随着前端工程化的发展,越来越多的项目采用模块化架构:单页面应用(SPA)、微前端、组件化框架等。这类架构带来了良好的可维护性和复用性,但也带来了新的调试挑战。 本文结合我们在多个模块化项目中的真实经验ÿ…...

EXCEL通过DAX Studio获取端口号连接PowerBI
EXCEL通过DAX Studio获取端口号连接PowerBI 昨天我分享了EXCEL链接模板是通过获取端口号和数据库来连接PowerBI模型的,链接:浅析EXCEL自动连接PowerBI的模板,而DAX Studio可以获取处于打开状态的PowerBI的端口号。 以一个案例分享如何EXCEL…...
PostgreSQL 技术峰会,为您打造深度交流优质平台
峰会背景 PostgreSQL 作为全球领先的开源关系型数据库管理系统,凭借其强大的功能、高度的扩展性和稳定性,在云计算、大数据、人工智能等领域得到了广泛应用。随着数字化转型的加速,企业对数据库技术的需求日益复杂和多样化,Postg…...
使用 OpenCV (C++) 进行人脸边缘提取
使用 OpenCV (C) 进行人脸边缘提取 本文将介绍如何使用 C 和 OpenCV 库来检测图像中的人脸,并提取这些区域的边缘。我们将首先使用 Haar级联分类器进行人脸检测,然后在检测到的人脸区域(ROI - Region of Interest)内应用 Canny 边…...

C# 委托UI控件更新例子,何时需要使用委托
1. 例子1 private void UdpRxCallBackFunc(UdpDataStruct info) {// 1. 前置检查防止无效调用if (textBoxOutput2.IsDisposed || !textBoxOutput2.IsHandleCreated)return;// 2. 使用正确的委托类型Invoke(new Action(() >{// 3. 双重检查确保安全if (textBoxOutput2.IsDis…...

大模型数据流处理实战:Vue+NDJSON的Markdown安全渲染架构
在Vue中使用HTTP流接收大模型NDJSON数据并安全渲染 在构建现代Web应用时,处理大模型返回的流式数据并安全地渲染到页面是一个常见需求。本文将介绍如何在Vue应用中通过普通HTTP流接收NDJSON格式的大模型响应,使用marked、highlight.js和DOMPurify等库进…...
python项目如何创建docker环境
这里写自定义目录标题 python项目创建docker环境docker配置国内镜像源构建一个Docker 镜像验证镜像合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPant…...
Eureka 高可用集群搭建实战:服务注册与发现的底层原理与避坑指南
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

PyTorch--池化层(4)
池化层(Pooling Layer) 用于降低特征图的空间维度,减少计算量和参数数量,同时保留最重要的特征信息。 池化作用:比如1080p视频——720p 池化层的步长默认是卷积核的大小 ceil 允许有出界部分;floor 不允许…...
GPU加速与非加速的深度学习张量计算对比Demo,使用PyTorch展示关键差异
import torch import time # 创建大型随机张量 (10000x10000) tensor_size 10000 x_cpu torch.randn(tensor_size, tensor_size) x_gpu x_cpu.cuda() # 转移到GPU # CPU矩阵乘法 start time.time() result_cpu torch.mm(x_cpu, x_cpu.t()) cpu_time time.time() - sta…...
Vue中的自定义事件
一、前言 在 Vue 的组件化开发中,组件之间的数据通信是构建复杂应用的关键。而其中最常见、最推荐的方式之一就是通过 自定义事件(Custom Events) 来实现父子组件之间的交互。 本文将带你深入了解: Vue 中事件的基本概念如何在…...

2025年大模型平台落地实践研究报告|附75页PDF文件下载
本报告旨在为各行业企业在建设落地大模型平台的过程中,提供有效的参考和指引,助力大模型更高效更有价值地规模化落地。本报告系统性梳理了大模型平台的发展背景、历程和现状,结合大模型平台的特点提出了具体的落地策略与路径,同时…...

PPTAGENT:让PPT生成更智能
想要掌握如何将大模型的力量发挥到极致吗?叶梓老师带您深入了解 Llama Factory —— 一款革命性的大模型微调工具。 1小时实战课程,您将学习到如何轻松上手并有效利用 Llama Factory 来微调您的模型,以发挥其最大潜力。 CSDN教学平台录播地址…...
Kotlin 中 companion object 扩展函数和普通函数区别
在 Kotlin 中,companion object 的扩展函数与普通函数(包括普通成员函数和普通扩展函数)有显著区别。以下是它们的核心差异和适用场景: 1. 定义位置与归属 特性companion object 扩展函数普通函数定义位置在类外部为伴生对象添加…...

《汇编语言》第13章 int指令
中断信息可以来自 CPU 的内部和外部,当 CPU 的内部有需要处理的事情发生的时候,将产生需要马上处理的中断信息,引发中断过程。在第12章中,我们讲解了中断过程和两种内中断的处理。 这一章中,我们讲解另一种重要的内中断…...

Redis实战-基于redis和lua脚本实现分布式锁以及Redission源码解析【万字长文】
前言: 在上篇博客中,我们探讨了单机模式下如何通过悲观锁(synchronized)实现"一人一单"功能。然而,在分布式系统或集群环境下,单纯依赖JVM级别的锁机制会出现线程并发安全问题,因为这…...