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.rhkb.cn/news/415912.html

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

相关文章

三级_网络技术_58_应用题

一、 请根据下图所示网络结构回答下列问题。 1.填写RG的路由表项。 目的网络/掩码长度输出端口__________S0(直接连接)__________S1(直接连接)__________S0__________S1__________S0__________S1 (2)如果在不改变路由表项的前提…

如何录制黑神话悟空的游戏BGM导入iPhone手机制作铃声?

在游戏的世界里,总有那么一些旋律,能够触动玩家的心弦,让人难以忘怀。《黑神话悟空》以其精美的画面和动人的背景音乐,赢得了无数玩家的喜爱。如果你也想将游戏中的背景音录制下来,制作成个性化的m4r格式铃声&#xff…

C++ 设计模式——备忘录模式

C 设计模式——备忘录模式 C 设计模式——备忘录模式1. 主要组成成分2. 逐步构建备忘录模式步骤1: 创建备忘录步骤2: 实现原发器步骤3: 创建管理者(负责人)类步骤4: 客户端使用 3. 备忘录模式 UML 图UML 图解析 4. 备忘录模式的优点5. 备忘录模式的缺点6…

Camtasia 2024 v2024.0.6 for Mac 中文版 屏幕录像视频录制编辑软件

TechSmith Camtasia for Mac 中文版 是一款专业的屏幕录像及视频录制编辑软件。以业界领先的清晰度重新定义了屏幕录制,将屏幕、摄像头、麦克风和系统音频捕获为独立音轨,实现终极控制和灵活性。通过拖放过渡、标注等功能,以及改进的工作流程…

AI-Talk开发板之helloword

一、说明 创建第一个应用在AI-Talk开发板上运行,编写一个“Hello World”应用,启动之后在主函数里通过UART0(debug)打印"Hello World"。 官方指导:第一个应用 | 聆思文档中心 (listenai.com) 二、创建工程…

标准库标头 <optional> (C++17)学习之optional

类模板 std::optional 管理一个可选 &#xfeff;的所含值&#xff0c;即既可以存在也可以不存在的值。 一种常见的 optional 使用情况是作为可能失败的函数的返回值。与如 std::pair<T, bool> 等其他手段相比&#xff0c;optional 可以很好地处理构造开销高昂的对象&a…

Ollama拉起本地模型以及rag系统部署。

什么是 Ollama &#xff1f; Ollama 是一个简明易用的本地大模型运行框架。能在本地启动并运行 Llama、qwen、Gemma 及其他大语言模型&#xff0c;没有GPU资源照样可以拉起模型&#xff0c;和LocalAI 比较类似&#xff0c;但是加载模型更容易。 1.安装 安装后运行&#xff0c…

统一NLP和目标检测的DETR(一)——self attention、encoder、decoder

主流目标检测算法劣势 YOLO系列&#xff0c;它基于anchor来做&#xff0c;少不了要用MNS&#xff0c;导致速度相对较慢。 但今天介绍一款DETR&#xff0c;基于VIT的目标检测算法。 那么我们需要先深入过一遍VIT。 Vision transform 1、传统RNN网络的问题 单向&#xff1a;只…

YOLOv8改进实战 | 引入混合局部通道注意力模块MLCA(2023轻量级)

YOLOv8专栏导航:点击此处跳转 前言 YOLOv8 是由 YOLOv5 的发布者 Ultralytics 发布的最新版本的 YOLO。它可用于对象检测、分割、分类任务以及大型数据集的学习,并且可以在包括 CPU 和 GPU 在内的各种硬件上执行。 YOLOv8 是一种尖端的、最先进的 (SOTA) 模型,它建立在以前…

C++和Python混合编程——Python调用C++入门

大纲 背景代码入门环境准备头文件业务代码注册BOOST_PYTHON_MODULE作用 boost::python::class_模板类 编译运行项目地址 背景 Python语言在大数据、人工智能以及大模型开发中扮演着举足轻重的角色&#xff0c;其影响力不断扩大并深化。 在大数据领域&#xff0c;Python以其简…

unittest | 使用unittest模块来测试logging日志模块功能

我们在这篇文章实现了在项目工程中编写一个logging模块&#xff0c;但是我们如何确定我们编写的模块功能的是否正常? 你可能想到将全部代码写完后运行测试&#xff0c;但这是一个非常不好的习惯。❌ 最好的方式&#xff0c;是每写出来一个功能或者方法就对它进行测试&#x…

Java设计模式之装饰器模式详细讲解和案例示范

1. 引言 装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许向现有对象添加新的功能&#xff0c;而无需修改其结构。这种模式通过使用组合而非继承来扩展对象的行为&#xff0c;在许多实际应用中极为常见。本文将详细介绍装饰器模式…

使用 docker 部署 kvm 图形化管理工具 WebVirtMgr

文章目录 [toc]前提条件镜像构建启动 webvirtmgr创建其他 superuser配置 nginx 反向代理和域名访问绑定 kvm 宿主机local sockettcp 连接 虚拟机创建创建快照虚拟机克隆删除虚拟机 kvm 官方提供了以下这些图形化管理&#xff0c;license 这块也提示了是商业版&#xff08;Comme…

Android实习面经整理第一篇

蔚来Android实习面经 一面(2024/3/11 35min) 自我介绍聊我的本专业说一说MVP架构,MVVM架构 MVP:V层持有P层,用户点击View,把数据发给P层,P层持有M层,然后P层把V层的数据发给M层获取其他数据,最后M层获取完数据后把数据还给P层,更新V层。P层也有V层的引用。MVVM:V层…

Qt 去掉QDialog对话框的问号

QT 对话框的问号是什么&#xff1f; QDialog默认的window flag中包含了Qt::WindowContextHelpButtonHint,这个flag意思是在窗口上提供“上下文帮助”按钮 使用方式/调用方式 void QWidget::setWhatsThis(const QString &)比如&#xff1a; ui->lineEdit_1->setWh…

【pycharm-乱码】简单记录一下都有哪些涉及编码

控制台 路径&#xff1a;setting-》general-》console setting-》editor-》file encodings 路径&#xff1a;setting-》editor->file and code templates #!/user/bin/env python3 # -*- coding: utf-8 -*-setting->tools->ssh terminal

Conda在线/离线迁移虚拟环境

conda简单使用 1.创建环境&#xff1a; conda create -n myenv python3.82.激活环境 conda activate myenv3.退出环境 conda deactivate4.安装包 pip install xxx5.列出所有环境 conda env list conda info --envs6.删除环境 conda remove -n myenv --all离线迁移conda …

【JavaWeb】JDBCDruidTomcat入门使用

本章使用技术版本&#xff1a; Tomcatv10.1.25 关于javaweb相关的其他技术&#xff0c;比如tomcat和maven&#xff0c;在我的主页记录了笔记&#xff0c;ajax我用的是本地笔记以后再考虑上传&#xff0c;前端三板斧我用的菜鸟教程文档 JDBC 初识 JDBC概念 JDBC 就是使用Jav…

三、建造者模式

构造者模式&#xff08;Builder Pattern&#xff09;使用简单的对象一步一步构建成一个复杂的对象。这种设计模式属于创建者模式&#xff0c;它提供了一种创建对象的最佳方式。一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。例如&#xff0c;计算…

LVDS与SerDes到底是什么关系?

随着智能座舱和智能驾驶功能的应用&#xff0c;汽车中的摄像头和液晶屏越来越多&#xff0c;多种图像显示和多屏互动也成为增强汽车智能化和用户体验的重点内容。 这些图像显示功能需要在不同的控制器之间或者控制器与远端的液晶屏或摄像头之间进行数据传输。 比如中控与仪表之…