Spring 学习笔记

news/2024/9/18 21:34:06/ 标签: spring

概述

Spring 是一个企业级 J2EE 应用开发一站式解决方案,其提供的功能贯穿了项目开发的表现层、业务层和持久化层,同时,Spring 可以和其他应用框架无缝整合

Spring 的特性包括以下几个方面:

  1. 轻量:Spring 是一个轻量级的框架,其核心 JAR 包的大小均为 1MB 左右。从系统的资源使用上来说,Spring 也是一个轻量级的框架,在其运行期间只需少量的操作系统资源便能稳定运行
  2. 控制反转:Spring 的控制反转指一个对象依赖的其他对象将会在容器的初始化完成后主动将其依赖的对象传递给它,而不需要这个对象自己创建或者查找其依赖的对象。Spring 基于控制反转技术实现系统对象之间依赖的解耦。
  3. 面向容器:Spring 实现了对象的配置化生成和对象的生命周期管理,通过 Spring 的 XML 文件或者注解方式,应用程序可以配置每个 Bean 对象被创建和销毁的时间,以及 Bean 对象被创建的先后顺序和依赖关系
  4. 面向切面:Spring 提供了面向切面的编程支持,面向切面技术通过分离系统逻辑和业务逻辑来提高系统的内聚性。在具体的使用过程中,业务层只需关注并实现和业务相关的代码逻辑,而不需要关注系统功能(例如系统日志、事务支持)
  5. 模块化:Spring 是模块化的,应用程序在使用过程中可以根据需求引入模块(以 JAR 包依赖方式引入)来实现不同的功能

Spring 的核心 Jar 包

  • Spring Core:Spring 的核心工具包
  • Spring Beans:SpingIoC 的实现,通过 XML 配置文件或注解的方式实现对 Spring Bean 的管理
  • Spring Context:Spring 上下文环境。用于对 Bean 关系的管理和推护等
  • Spring Aspects:Spring 对 AspectJ 框架的整合和支持
  • Spring Context Support:SpringContext 的扩展支持,用于支持 MVC 方面的功能
  • Spring Expression Language:Spring 的表达式语言
  • Spring Framework Bom:处理不同的项目依赖不同版本的 Spring 引起的版本冲突
  • Spring JDBC:Spring 针对 JDBC 的封装
  • Spring ORM:Spring 整合第三方 ORM 的实现,例如 Mybatis
  • Spring Test:Spring 对 JUnit 等测试框架的支持
  • Spring TX:Spring 提供的一致性声明式事务管理和编程式事务管理
  • Spring Web:基于 Spring 构建 Web 应用开发所需的核心类
  • Spring WebMVC:包含 SpringMVC 框架相关的所有类

SpringIoC 原理

SpringIoC(Inversion of Control)即“控制反转”,是一种设计思想,将对象的创建和对象之间依赖关系的维护交给容器来负责,以实现对象与对象之间的松耦合

Spring 通过一个配置文件描述 Bean 和 Bean 之间的依赖关系,利用 Java 的反射功实例化 Bean 并建立 Bean 之间的依赖关系。

Spring 在启动时会从 XML 配置文件或注解中读取应用程序提供的 Bean 配置信息,并在 Spring Bean 容器中生成一份相应的 Bean 配置注册表,然后根据这张注册表实例化 Bean,装配好 Bean 之间的依赖关系,将 Bean 实例放入缓存池,Bean 缓存池采用 HashMap 实现

Spring 为 Bean 定义了五种作用域:

  1. Singleton:Singleton 是单例模式,当实例类型为单例模式时,在 SpringIoC 容器中只会存在一个共享的 Bean 实例,无论有多少个 Bean 引用它,都始终指向同一个 Bean 对象。该模式在多线程下是不安全的。Singleton 作用域是 Spring 中的默认作用域
  2. Prototype:Prototype 是原型模式,每次通过 Spring 容器获取 Prototype 定义的 Bean 时,容器都将创建一个新的 Bean 实例,每个 Bean 实例都有自己的属性和状态。因此,对有状态的 Bean 经常使用 Prototype 作用域,而对无状态的 Bean 则使用 Singleton 作用域
  3. Request:Request 指在一次 HTTP 请求中容器会返回该 Bean 的同一个实例,对不同的 HTTP 请求则会创建新的 Bean 实例,并且该 Bean 实例仅在当前 HTTP 请求内有效,在当前 HTTP 请求结束后,该 Bean 实例也将随之销毁
  4. Session:Session 指在一次 HTTP Session 中,容器会返回该 Bean 的同一个实例,对不同的 Session 请求则会创建新的 Bean 实例,该 Bean 实例仅在当前 Session 内有效,Session 每一次都会创建新的 Bean 实例,而不同的 Bean 实例之间不共享数据,请求结束,则 Bean 实例将随之销毁
  5. Global Session:Global Session 类似于 Session,不过仅在 Portlet Web 应用中使用。 portlet 规范定义了构成单个 Portlet Web 应用的所有 portlet 之间共享的全局会话的概念。如果不是 Portlet Web 应用,则与 Session 无异

Spring Bean 的生命周期如下所示:

  1. 实例化一个Bean
  2. 按照 Spring 上下文对实例化的 Bean 进行配置
  3. 根据配置加载执行:
  4. 如果 Bean 实现了 BeanNameAware接 口,则会执行它实现的 setBeanName(String) 方法。该方法传递的参数是 Spring 配置文件中 Bean 的 id 值
  5. 如果 Bean 实现了 BeanFactoryAware 接口,则会执行它实现的 setBeanFactory(BeanFactory) 方法,该方法传递的参数是 Spring 工厂自身
  6. 如果 Bean 实现了 ApplicationContextAware 接口,则会执行 setApplicationContext(ApplicationContext) 方法,该方法传递的参数是 Spring 上下文
  7. 如果 Bean 关联了 BeanPostProcessor 接口,则会执行 postProcessBeforeInitialization(Object obj, String s) 方法,该方法在 Bean 初始化前调用,常用于定义初始化 Bean 的前置工作,比如系统缓存的初始化
  8. 如果 Bean 在 Spring 配置文件中配置了 init-method 属性,则会自动执行其配置的初始化方法
  9. 如果 Bean 关联了 BeanPostProcessor 接口,将会执行 postProcessAfterInitialization(Object obj, String s) 方法,至此,Bean 的初始化工作就完成了,应用程序可以开始使用Bean实例了
  10. 当 Bean 不再被需要时,会在清理阶段被清理掉、如果 Bean 实现了 DisposableBean 接口,Spring 会在退出前调用实现类的 destroy 方法
  11. 如果 Bean 的 Spring 配置文件中配置了 destroy-method 属性,则在 Bean 销毁前会自动调用其配置的销毁方法

SpringAOP 原理

SpringAOP 通过面向切面技术将与业务无关却为业务模块所共用的逻辑代码封装起来。以提高代码的复用率,降低模块之间的耦合度

SpringAOP 核心概念如下:

  • 横切关注点:定义对哪些方法进行拦裁,以及在拦被后执行哪些操作
  • 切面(Aspect):横切关注点的抽象
  • 连接点(JoinPoint):指被拦截到的方法
  • 切入点(PointCut):对连接点进行拦戳的定义
  • 通知(Advice):拦截到连接点之后要执行的具体操作,分为前置通知、后置通知、成功通知、异常通知和环绕通知
  • 目标对象:代理的目标对象
  • 织入(Weave):将切面应用到目标对象并执行代理对象创建的过程
  • 引入(Introduction):在运行期为类动态地添加一些方法或字段而不用修改类的代码

SpringAOP 有五种通知类型:

  • 前置通知:在一个方法执行之前执行通知
  • 后置通知:在一个方法执行之后执行通知,无论方法执行成功还是失败
  • 成功通知:在一个方法执行成功之后执行通知,只有在方法执行成功时才执行
  • 异常通知:在一个方法抛出异常时才执行
  • 环绕通知:在拦截方法调用之前和之后分别执行

Spring 提供了 JDK 和 CGLib 两种方式来生成代理对象,具体生成方式由 AopProxyFactory 根据 AdvisedSupport 对象的配置来决定。Spring 默认的代理对象生成策略:如果是目标类接口,则使用 JDK 动态代理技术,否则使用 CGLib 动态代理技术

CGLib 动态代理和 JDK 动态代理的区别:JDK 只能为接口创建代理实例,而对于没有通过接口定义业务方法的类,则只能通过 CGLib 创建动态代理来实现


SpringMVC 原理

SpringMVC 中的 MVC 即模型-视图-控制器,该框架围绕一个 DispatcherServlet 改计而成,DispatcherServlet 会把请求分发给各个处理器,并支持可配置的处理器映射和视图渲染等功能

SpringMVC 的工作流程如下所示:

  1. 客户端发起 HTTP 请求:客户端将请求提交到 DispatcherServlet
  2. 寻找处理器:DispatcherServlet 控制器查询一个或多个 HandlerMapping,找到处理该请求的 Controller
  3. 调用处理器:DispatcherServlet 将请求提交到 Controller
  4. 调用业务处理逻辑并返回结果:Controller 在调用业务处理逻辑后,返回 ModelAndView
  5. 处理视图映射并返回模型:DispatcherServlet 查询一个或多个 ViewResolver 视图解析器,找到 ModelAndView 指定的视图
  6. HTTP 响应:视图负责将结果在客户端浏览器上谊染和展示

http://www.ppmy.cn/news/1520574.html

相关文章

JavaScript初级——BOM

1、BOM —— 浏览器对象模型 —— BOM可以使我们通过 JS 来操作浏览器 —— 在BOM中为我们提供了一组对象,用来完成对浏览器的操作 2、BOM对象: ① Window —— 代表的是整个浏览器的窗口,同时 window 也是网页中的全局对象。 ② Navig…

MySQL面试题精简版

目录 SQL内连接与外连接的区别 drop、delete与truncate区别 UNION与UNION ALL的区别 CHAR和VARCHAR的区别 MyISAM和InnoDB的区别 数据库中的锁 数据库三大范式 数据库特性 并发事务带来的问题 数据库事务隔离级别 索引的分类 索引的创建原则 索引失效的情况 MySQ…

Android --- observer和observerForever的区别

observe 和 observeForever 是 LiveData 中的两个方法,用于观察数据的变化,但它们在生命周期管理和适用场景上有区别: ---->observe: 用途: 注册一个观察者,该观察者在 LifecycleOwner(如 Activity 或 Fragment&am…

深入学习电路基础:从理论到实践

引言 电路是电子学的核心,也是现代科技的基石。从简单的灯泡开关到复杂的计算机处理器,电路在各类电子设备中都起到了至关重要的作用。深入学习电路知识不仅有助于理解电子设备的工作原理,还能够为实际设计和开发电子产品打下坚实的基础。 …

计算机网络 第1章 概述

文章目录 计算机网络概念计算机网络的组成计算机网络的功能三种数据交换技术电路交换(Circuit Switching)报文交换(message)分组交换 三种交换方式性能对比计算机网络的分类计算机网络的性能指标性能指标1:速率性能指标…

【无标题】使用Go (或者 Python) 执行外部命令,直接模式和 Shell模式的区别

有时,我们需要通过编程语言执行外部程序、命令或脚本。 Go 语言里提供了 “os/exec” 库,Python 里面也提供了 subprocess 这样的库。 但在具体调用外部命令时,有两种方式: 直接调用外部命令通过 Shell 调用外部命令 以 Go 语…

C#之中SqlConnection的Close和Dispose的区别和在使用using语句管理SqlConnection对象时,如果发生异常,连接对象会怎样?

SqlConnection的Close和Dispose的区别 在C#中,SqlConnection对象的Close和Dispose方法都可以用来释放数据库连接资源,但它们的作用和使用场景有所不同。 Close 方法 SqlConnection.Close方法用于关闭与数据库的连接。当你调用这个方法时,它…

nginx配置白名单服务

http { # 其他配置… # 定义一个名为 whitelist 的共享内存区域 limit_zone whitelist $binary_remote_addr 10m;server {listen 80;server_name example.com;# 白名单配置location / {# 设置只允许特定 IP 访问allow 192.168.1.100; # 允许的 IPallow 192.168.1.10…

Spring Cloud全解析:网关之GateWay过滤器

GateWay过滤器 路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应,只能指定路由进行使用,由GatewayFilter的工厂类来产生,Gateway官方提供了很多的路由过滤器,也可以实现自己的自定义过滤器 内置过滤器 请求头/响应头过滤器…

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

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

作为HR如何解决薪资谈判的僵局

作为HR如何跟候选人谈薪资问题,特别候选人的期望值,和公司对岗位的设定范围存在不对等的情况下,HR和候选人的薪资谈判往往就陷入僵局。面对这种情况,是直接放弃,还是有努力的空间呢? 在面对薪资谈判僵局时…

使用PyTorch从零构建Llama 3

我们上次发了用PyTorch从零开始编写DeepSeek-V2的文章后,有小伙伴留言说希望介绍一下Llama 3。那么今天他就来了,本文将详细指导如何从零开始构建完整的Llama 3模型架构,并在自定义数据集上执行训练和推理。 [图1]:Llama 3架构展示…

Nginx中间件配置

Nginx中间件配置 概要相关内容技术细节链接 概要 用于Linux服务器,Nginx中间件搭建。 相关内容 配置涵盖域名配置,TLS配置,及配置安全的加密算法,处理跨域问题,请求头问题等 技术细节 nginx.conf 配置文件 user …

PyTorch常用库函数:torch.acos()的详解实战使用

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 引言一、函数简介1.2 函数语法1.3 参数说明 二、 示例代码2.1 注意事项 总结 引言 PyTorch 是一个流行的深度学习框架…

Node.js中的SQLite库:安装、对比与选择指南

嘿,各位Node.js的江湖好汉们,今天咱们来聊聊如何在Node.js中安装SQLite库,并且来一场SQLite库的PK大战,看看哪个库才是你的“菜”! 一、安装SQLite库:轻松加愉快 想要在Node.js中使用SQLite数据库&#x…

Proxifier代理配置

Proxifier代理配置 ①:finalShell 建立隧道 1.连接服务器 10.8.96.147 root/Iptvyg189 2.配置隧道 类型:SOCKS5监听端口:自定义一个随便绑定ip:本机 127.0.0.1 ②:Proxifier代理配置 1.配置文件 > 代理服务器 &g…

【Vue】Vue3.5 新特性

useId 为 每一个 vue 文件创建一个唯一的 id&#xff1a; app.vue import {useId} from "vue"; import Child from "/Child.vue";const comId useId(); console.log(">(App.vue:5) comId", comId);// ...<Child />useTemplateRef u…

尚品汇-项目目前存在问题、引入MQ(四十二)

目录&#xff1a; &#xff08;1&#xff09;目前存在的问题 &#xff08;2&#xff09;消息队列解决什么问题 &#xff08;3&#xff09;消息队列工具 RabbitMQ &#xff08;4&#xff09;搭建mq测试环境service-mq 下面我们先做的是前面后台管理系统商品上下架的没完成的…

【nnUNet】nnUNet的出现

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ&#xff1a;870202403 公众号&#xff1a;VTK忠粉 前言 本文分享nnUNet的一些基本情况&#xff0c;以便更好的了解&#xff01; 感谢各位小伙伴的点赞关注&#xff0c;小易会继续努力分享&#xff0c;一起进步&#xff01;…

零基础5分钟上手亚马逊云科技-基础设施即代码开发

简介&#xff1a; 欢迎来到小李哥全新亚马逊云科技AWS云计算知识学习系列&#xff0c;适用于任何无云计算或者亚马逊云科技技术背景的开发者&#xff0c;通过这篇文章大家零基础5分钟就能完全学会亚马逊云科技一个经典的服务开发架构方案。 我会每天介绍一个基于亚马逊云科技…