【Spring学习】
Spring学习
简介
Spring 是一个开源的 Java 企业级开发框架,最核心的特点是:
- IOC(控制反转)
- AOP(面向切面编程)
它有完整的生态:
- 🚀 Spring Boot:用于快速构建服务
- 🔒 Spring Security:做权限认证
- ☁️ Spring Cloud:做微服务
现在很多 Java 项目基本都是以 Spring Boot 为基础搭建的。
核心特点
IOC(控制反转)
简介
-
Inversion of Control
-
它是一种思想,核心理念是:把“创建对象 + 管理依赖”的控制权从代码中交给框架(比如 Spring)。
-
DI(依赖注入)
- Dependency Injection
- 它是实现 IOC 的一种方式,也是 Spring 中最常用的方式(使用注解
@Autowired)。
关系总结:
| 概念 | 说明 |
|---|---|
| IOC | 是理念(控制权的转移) |
| DI | 是手段(实现方式) |
在 Spring 中:
- DI 让我们不用手动
new对象 - 框架会根据配置自动注入依赖
Bean
Spring的核心理念之一是 IOC(控制反转),即通过 Spring 容器来管理对象的创建和生命周期。这些对象都可以称为 Bean。
简介
- Bean 是指由 Spring 容器管理的一个对象
- Spring 使用 IOC 和 DI 机制来管理应用程序中的对象
- Bean 可以是任何类的实例,Spring 会负责它的创建、配置和生命周期管理
特点
- 由 Spring 容器(通常是
ApplicationContext)管理的对象 - 在 Spring 配置文件中或通过注解(如
@Component、@Service、@Repository、@Controller等)定义的,并由 Spring 容器自动创建和管理。 - Spring 容器会负责实例化这些对象,注入它们的依赖关系,并在应用程序运行时进行管理。
生命周期
- 在容器启动时被创建(实例化)
- 在应用程序的生命周期内保持可用
- Spring 管理其完整生命周期,包括初始化和销毁过程
定义方式
1.通过注解定义,使用注解标记类为 Spring Bean:
@Service
public class UserService {// 业务逻辑
}
2.通过 XML 配置定义 Bean:在 applicationContext.xml 文件中,通过 标签定义 Bean。
<bean id="userService" class="com.example.UserService"/>
3.通过 Java 配置类定义 Bean:使用 @Configuration 、 @Bean 等注解来定义 Bean。
@Configuration
public class AppConfig {@Beanpublic UserService userService() {return new UserService();}
}
作用域(Scope)
Spring 允许你为 Bean 配置不同的作用域(scope),决定它的生命周期和创建时机。常见的作用域有:
- singleton:默认作用域,Spring 容器中只会有一个 Bean 实例。
- prototype:每次请求都会创建一个新的 Bean 实例。
- request、session、application 等:这些是基于 web 应用的特定作用域,通常用于 web 项目中。
AOP切面编程
简介
AOP(面向切面编程)是一种编程思想,它的目标是将程序中那些 横切关注点(cross-cutting concerns)从主业务逻辑中分离出来。
📌 举例说明:
在很多业务方法中都要做这些事:
- 记录日志
- 权限验证
- 异常处理
- 性能监控
- 事务管理
这些跟业务逻辑(比如"下单"、“支付”、“查询用户信息”)无关但又必须做的操作就是横切关注点。
功能
把通用代码抽出来统一处理,让业务代码更干净、更专注。
实现方式
Spring 提供了基于 代理机制(Proxy) 的 AOP 实现方式:
- JDK 动态代理:针对接口
- CGLIB 动态代理:针对类
核心概念
| 名称 | 说明 |
|---|---|
| 切面(Aspect) | 封装横切逻辑的类,比如日志、事务、权限检查等 |
| 连接点(Join Point) | 程序中可以插入切面逻辑的位置(通常是方法调用) |
| 切入点(Pointcut) | 定义要拦截哪些方法 |
| 通知(Advice) | 指定在什么时候执行横切逻辑(比如:方法前/后/异常时) |
| 织入(Weaving) | 将切面代码织入到目标对象的过程 |
应用实例
日常开发中我们可能感觉不到AOP的存在,是因为很多AOP功能是Spring框架"自动实现"的,开发者实际上是在隐式使用AOP。
| 功能 | 实现方式 | AOP实现机制 |
|---|---|---|
@Transactional 注解 | 开启事务管理 | 通过AOP织入事务逻辑 |
@Async 注解 | 方法异步调用 | 通过AOP织入异步代理逻辑 |
@Cacheable 注解 | 缓存处理 | 通过AOP织入缓存判断逻辑 |
@PreAuthorize 注解 | 方法级安全控制 | 基于Spring Security的AOP实现 |
| Controller参数校验 | @Valid 注解校验 | 通过AOP织入参数校验逻辑 |
@Retryable 注解 | 方法失败自动重试 | 基于Spring Retry的AOP实现 |
实现特点:
- 这些功能本质上都是通过Spring AOP或AspectJ实现的
- Spring Boot自动配置会为这些功能自动创建代理对象
- 默认使用运行时织入(Runtime Weaving)方式
- 在方法内部调用时可能失效(因为绕过了代理机制)
Spring 生态系统
"生态"指的是围绕Spring核心框架,衍生出来的一整套子项目和解决方案,它们可以无缝协作,覆盖一个大型项目从开发、测试、部署、运维到监控的整个生命周期。
核心组件
| 模块 | 功能描述 |
|---|---|
| Spring Framework | 核心框架,提供IOC、AOP、事务管理等基础功能 |
| Spring Boot | 快速构建独立运行的Spring应用,简化配置、开箱即用 |
| Spring MVC/WebFlux | MVC是传统同步模型,WebFlux是响应式非阻塞模型 |
| Spring Data | 简化数据库操作(支持JPA、MongoDB、Redis等) |
| Spring Security | 提供认证和授权的安全框架 |
| Spring Cloud | 微服务架构解决方案(服务注册发现、配置中心、断路器等) |
| Spring Batch | 批处理任务解决方案(大数据量、定时处理) |
| Spring Integration | 面向消息驱动架构的集成方案(适合构建分布式系统) |
| Spring Test | 提供测试支持,方便进行单元测试和集成测试 |
生态优势
✅ 统一风格:所有模块遵循同一套设计理念,学习一个就能用一片
✅ 高扩展性:可以单独使用部分模块,也能组合多个模块构建复杂系统
✅ 社区活跃:拥有强大的开源社区和丰富的生态资源
✅ 兼容性好:与Docker、Kubernetes、主流消息队列、数据库和云平台无缝集成
✅ 持续演进:定期更新迭代,保持技术先进性
典型应用场景
- 企业级应用开发
- 微服务架构
- 云原生应用
- 批处理系统
- 响应式编程
Spring Boot
简介
是 Spring 官方推出的一个快速开发框架,用于简化 Spring 应用的搭建和开发过程,即spring快速开发脚手架,可对比vue开发脚手架进行学习。
目标:
- 快速搭建项目
- 减少繁琐配置
- 提供开箱即用的解决方案(依赖管理、配置、内嵌服务器等)
Spring Boot 与 Spring 的关系
Spring 是一个功能强大但配置相对复杂的底层框架;
Spring Boot 是基于 Spring 的快速开发工具,提供自动配置、依赖整合、快速启动等能力。
| 对比项 | Spring | Spring Boot |
|---|---|---|
| 本质 | 底层开发框架 | 快速开发框架(工具 + 配置封装) |
| 配置方式 | 手动配置较多(XML/Java) | 自动配置为主,默认约定优于配置 |
| 启动方式 | 通常打包部署到容器 | 内嵌 Tomcat,main 方法直接运行 |
| 目标 | 灵活,功能全面 | 简化开发,提高效率 |
核心特性
- ✅ 自动配置:根据依赖和类路径自动配置项目所需的功能。
- ✅ Starter 起步依赖:通过
spring-boot-starter-xxx快速引入一整套所需依赖。 - ✅ 内嵌 Web 服务器:默认集成 Tomcat,无需打包成 war 部署。
- ✅ 统一配置文件:集中管理配置项(
application.yml或application.properties)。 - ✅ 快速启动机制:通过
SpringApplication.run()启动整个项目。 - ✅ 无缝集成 Spring 生态:Spring Security、Spring Data、Spring Cloud 等可直接整合。
相关文章:
【Spring学习】
Spring学习 简介 Spring 是一个开源的 Java 企业级开发框架,最核心的特点是: IOC(控制反转)AOP(面向切面编程) 它有完整的生态: 🚀 Spring Boot:用于快速构建服务&a…...
网络基础与 HTTP 协议
一、网络基础 (一)TCP/IP 协议族 TCP/IP 协议族是互联网通信的核心协议,它包含了多个层次的协议,共同协作实现网络通信。 1. IP 协议 IP(Internet Protocol)协议位于网络层,主要负责将数据包…...
SRS transcode支持 h264_nvenc 硬件解码方案
文章目录 SRS transcode支持 h264_nvenc 硬件解码方案1、修改文件2、重新编译3、使用 SRS transcode支持 h264_nvenc 硬件解码方案 SRS 是开源的流媒体服务,但在使用 GPU 服务器时,想要通过硬件加速,目前官方是不支持的,所以简单…...
阿里云服务器搭建开源版禅道
一,下载地址:禅道11.5版本发布,主要完善细节,修复bug,新增动态过滤机制 - 禅道下载 - 禅道项目管理软件 下载地址二: 禅道21.6.stable 实现旧编辑器撰写的文档无感升级至新版编辑器 - 禅道下载 - 禅道项目…...
【刷题Day21】TCP(浅)
说说 TCP 的四次挥手? TCP的四次挥手事用于安全关闭一个已建立的连接的过程,它确保双方都能完成数据传输并安全地释放连接资源。 简述步骤: 第一次挥手(FIN --> ACK):客户端主动关闭连接,…...
怎么用面向对象和状态机架构,设计一个通用的按键检测功能?
说起按键检测,在座的各位,哪个没被它折磨过? 我刚入门时,为了实现一个简单的按键功能,硬生生写了几十行代码,各种 if...else 嵌套,逻辑绕得我自己都头晕。 更可气的是,辛辛苦苦写完…...
Java基础系列-LinkedList源码解析
文章目录 简介LinkedList 插入和删除元素的时间复杂度?LinkedList 为什么不能实现 RandomAccess 接口? LinkedList 源码分析Node 定义初始化获取元素插入元素删除元素遍历链表 简介 LinkedList 是一个基于双向链表实现的集合类,经常被拿来和…...
day47—双指针-平方数之和(LeetCode-633)
题目描述 给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a^2 b^2 c 。 示例 1: 输入:c 5 输出:true 解释:1 * 1 2 * 2 5示例 2: 输入:c 3 输出:f…...
qwen 14B模型配置文件,层名称weight_map. 28GB
qwen 14B模型配置文件,层名称weight_map. 28GB 目录 qwen 14B模型配置文件,层名称weight_map. 28GBmetadata(元数据)weight_map(权重映射)lm_head.weightmodel.layersmlp.{proj_type}.weightpost_attention_layernormself_attn.{proj_type}.{bias_or_weight}model.norm.w…...
LVDS系列8:Xilinx 7系可编程输入延迟(一)
在解析LVDS信号时,十分重要的一环就是LVDS输入信号线在经过PCB输入到FPGA中后,本来该严格对齐的信号线会出现时延,所以需要在FPGA内部对其进行延时对齐后再进行解析。 Xilinx 7系器件中用于输入信号延时的组件为IDELAYE2可编程原语࿰…...
【Oracle专栏】函数中SQL拼接参数 报错处理
Oracle相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 1.背景 最近同事反馈了一个很奇怪的问题,即有一个函数,入参是当前年月,主要作用是通过SQL语句将不合规的数据插入到指定表中,插入数据时带上入参的年月参数。当前问题:单独测试SQL没有问题可以执行成功,…...
自然语言处理(NLP)领域大图
以下是一份自然语言处理(NLP)与大模型领域的领域大图,涵盖技术框架、发展脉络、交叉融合点和应用场景的完整解析: 1. 核心技术体系 基础分析层级 词法分析:分词、词性标注、命名实体识别句法分析:依存句法…...
【Linux我做主】GDB调试工具完全指南
Linux下GDB调试工具完全指南:25个核心命令详解与实战示例 github地址 有梦想的电信狗 前言 GDB(GNU Debugger)是Linux开发中不可或缺的调试工具,尤其在定位代码逻辑错误和内存问题时表现卓越。本文基于实际开发经验࿰…...
Pycharm 如何删除某个 Python Interpreter
在PyCharm中,点击右下角的“Interpreter Settings”按钮,或者通过菜单栏选择“File” > “Settings”(macOS用户选择“PyCharm” > “Preferences”)。在设置窗口中,导航到“Project: [Your Project Name]” >…...
在 Debian 12 中恢复被删除的 smb.conf 配置文件
https://forum.ubuntu.com.cn/viewtopic.php?t494763 本文结合ai输出,内容中可能有些错误,但确实解决了我的问题,我采取保留完整输出的方式摘录。 在 Debian 12 中恢复被删除的 smb.conf 配置文件,需结合 dpkg 和 ucf(…...
Day3:个人中心页面布局前端项目uniapp壁纸实战
接下来我们来弄一下个人中心页面布局user.vue <template><view class"userLayout"><view class"userInfo"><view class"avatar"><image src"../../static/Kx.jpg" mode"aspectFill"></im…...
访问”和“初始化本质区别以及C++静态成员变量定义位置详解
💡 1.访问”和“初始化本质区别: ✅ 访问 protectedNum:Derived 作为 Base 的子类,是可以在自己的函数中访问 protectedNum 的。❌ 初始化 protectedNum:只能通过 Base 的构造函数来初始化,因为它是 Base …...
正则表达式反向引用的综合应用魔法:从重复文本到简洁表达的蜕变
“我....我要....学学学学....编程 java!” —— 这类“重复唠叨”的文本是否让你在清洗数据时头疼不已? 本文将带你一步步掌握正则表达式中的反向引用技术,并结合 Java 实现一个中文文本去重与清洗的实用工具。 结合经典的结巴实例。如何高效地将这样的…...
C实现md5功能
md5在线验证: 在线MD5计算_ip33.com 代码如下: #include "md5.h" #include <string.h> #include "stdio.h"/** 32-bit integer manipulation macros (little endian)*/ #ifndef GET_ULONG_LE #define GET_ULONG_LE(n,b,i) …...
FFmpeg+Nginx+VLC打造M3U8直播
一、视频直播的技术原理和架构方案 直播模型一般包括三个模块:主播方、服务器端和播放端 主播放创造视频,加美颜、水印、特效、采集后推送给直播服务器 播放端: 直播服务器端:收集主播端的视频推流,将其放大后推送给…...
在 Debian 10.x 安装和配置 Samba
1. 更新系统 sudo apt update sudo apt upgrade -y2. 安装 Samba sudo apt install samba -y3. 配置 Samba 备份默认配置文件 sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak编辑配置文件 sudo nano /etc/samba/smb.conf示例配置(共享目录) …...
基础(测试用例:介绍,测试用例格式,案例)
目录 测试用例介绍 测试用例编写格式 案例 测试用例介绍 用例:用户使用软件的案例场景 测试用例:是为测试项目而设计的测试执行文档 测试用例的作用: 防止漏测是实施测试的标准可以作为测试工作量的评估 测试用例编写格式 用例编号 用例…...
C++学习:六个月从基础到就业——内存管理:RAII原则
C学习:六个月从基础到就业——内存管理:RAII原则 本文是我C学习之旅系列的第十九篇技术文章,也是第二阶段"C进阶特性"的第四篇,主要介绍C中的RAII原则及其在资源管理中的应用。查看完整系列目录了解更多内容。 引言 在…...
Windows串口通信
Windows串口通信相比较Android串口通信,在开发上面相对方便一些。原理都是一样,需要仔细阅读厂商设备的串口通信协议。结合串口调试助手进行测试,测试通过后,编写代码实现。 比如近期就接触到了一款天平,其最大测量值为100g,测量精度0.001g。 拿到手之后我就先阅读串口通…...
bert项目解析
数据预处理 读取csv数据集 def read_file(file_path):data []label []with open(file_path, "r", encoding"utf-8") as file:reader csv.reader(file)next(reader) # 跳过标题行# row每一行用英文逗号分割成列表[标签,文本] 所以标签和文本用英文逗…...
Linux `init` 相关命令的完整使用指南
Linux init 相关命令的完整使用指南—目录 一、init 系统简介二、运行级别(Runlevel)详解三、常用 init 命令及使用方法1. 切换运行级别2. 查看当前运行级别3. 服务管理4. 紧急模式(Rescue Mode) 四、不同 Init 系统的兼容性1. Sy…...
【开源项目】Excel手撕AI算法深入理解(三):时序(RNN、mamba、Long Short Term Memory (LSTM)、xLSTM)
项目源码地址:https://github.com/ImagineAILab/ai-by-hand-excel.git 一、RNN 1. RNN 的核心思想 RNN 的设计初衷是处理序列数据(如时间序列、文本、语音),其核心特点是: 隐藏状态(Hidden Stateÿ…...
嵌入式音视频开发指南:从MPP框架到QT实战全解析
嵌入式音视频开发指南:从MPP框架到QT实战全解析 一、音视频技术全景概述 1.1 技术演进里程碑 2003-2010年:标清时代(H.264/AVC + RTMP)2011-2018年:高清时代(H.265/HEVC + WebRTC)2019-至今:智能时代(AV1 + AI编解码 + 低延迟传输)1.2 现代音视频技术栈 #mermaid-s…...
构建专业金融图表系统的高效路径——QtitanChart在金融行业的应用价值
QtitanChart是一个C 库,它代表一组控件,这些控件使您可以快速轻松地为应用程序提供漂亮而丰富的图表。QtitanChart在Qt.C 上实现,并且支持所有主要的桌面操作系统 - Windows、Linux和Mac OSX。要将QtitanChart添加到您的程序中,只…...
如何通过window端来ssh连接本地虚拟机的ubuntu
首先在 Ubuntu 虚拟机上安装和配置 SSH 服务: # 安装 SSH 服务器 sudo apt update sudo apt install openssh-server# 检查 SSH 服务状态 sudo systemctl status ssh# 如果没有启动,则启动 SSH 服务 sudo systemctl start ssh# 设置开机自启动 sudo sys…...
