Spring 学习笔记

news/2024/9/20 15:05:53/文章来源:https://www.cnblogs.com/Yee-Q/p/18394395

概述

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.hqwc.cn/news/791673.html

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

相关文章

keycloak~Refresh_token阶段不走RequiredAction

Refresh_token是在access_token过期之后,用来换新的access_token的,有了Refresh_token之后,用户可以在很长一段时间不需要重新登录,这对于用户体验是有好处的;RequiredAction是一种登录阶段的必选行为,当一个用户被某个RequiredAction标记之后,用户必须完成RequiredActi…

谁还不知道用ChatmoneyAI写短剧脚本,真能火

本文由 ChatMoney团队出品现在大家打开抖音、小红书,琳琅满目,目光所能及的都是各种吸精剧情的小短剧,虽然这些短剧的制作成本低,但是作为编剧的要写脚本,可不认为这么容易啊......... 接下来我给大家推荐一下使用ChatmoneyAI创作短剧脚本的步骤吧,让你笔下的短剧也能轻轻…

【研判系列】研判事件汇总

原创 零漏安全1、木马后门程序Chopper Webshell检测2、webshell caidao_client,木马后门程序Chopper Webshell检测3、木马后门程序Chopper Webshell检测4、webshell caidao_client5、蚁剑webshell通信行为6、apache log4j2远程代码执行漏洞7、sql注入oracle func chr8、sql注入…

如何查看极狐GitLab 的组件状态?

本文分享使用 gitlab-ctl 命令来对极狐GitLab 的组件进行状态查询和关闭与重启等操作。 极狐GitLab 是一个多组件系统,主要组件包括:Gitaly GitLab exporter Nginx Redis Sidekiq PostgreSQL Puma Workhorse Registrygitlab-ctl可以对上述组件的状态进行查询,以及关闭、重启…

10、DB-创建数据库表-SQL语句

-- 目标:创建一个school数据库create database `school`; -- 创建一个学生表(列、字段) 使用SQL创建 -- 学号int 登陆密码varchar(20) 姓名 性别varchar(2) 出生日期(datetime) 家庭地址 email-- 注意点:使用英文() 表的名称 和 字段 尽量使…

基于 Zynq-7 的高性能 PCIe 载板

基于 Zynq-7 的高性能 PCIe 载板是一款高性能 PCIe 2.0X8 的载板 , 板载 1 个 HPC 形式的 FMC 连接器。主控芯片采用 Xilinx 公司 Zynq-7 系列SoC 家族中的 XC7Z100-2FFG900I(兼容 XC7Z045-2FFG900和 XC7Z035-2FFG900)。其 PS 搭配 2 颗 16bit-1866 的512MB DDR3 SDRAM 和一片…

STM32的bootloader探究

bootloader是MCU上电之后运行的第一段程序,记录我对bootloader的学习过程OTAOTA(Over-The-Air Technology,空中下载技术)是一种通过无线网络对设备进行远程升级的技术。这种技术最初在PC电脑和移动手机行业中得到应用,近年来在汽车行业中也得到了广泛的应用。IAP:In-Appl…

给P人一点小小震撼!铁威马UI全新设计!更友好更美观~

开学了,小马居然发现有学校竟然玩起了新花样,通过MBTI来分宿舍,这脑洞大开的创意简直让人直呼内行! 你是P人还是J人? 在MBTI人格分类中,J人喜欢条理清晰的计划,而P人则倾向于随性所欲。 想象一下,J人与P人意外成了室友,那画面也是挺有趣的,可能会有不少‘文化碰撞’的…

php获取FTP服务器中文件内容返回给前端

有一个需求是访问存储在群辉Synology NAS上的图片,https://ip:port/path/to/image.jpg,用浏览器打开会出现“您的连接不是私密/安全连接”错误。网上检索资料发现可能是因为缺少SSL证书的关系。 引用 https://www.cloudflare-cn.com/learning/ssl/connection-not-private-exp…

开源问卷调查和考试系统 SurveyKing 安装和使用教程

最近公司又要搞什么满意度调查了,我这个小菜鸟又要头疼了。上次用那个破系统,界面丑不说,功能还少得可怜,搞得我加班到半夜。这回非得找个好用的不可。 正发愁呢,突然想起来前两天同事小王推荐了一个叫 “卷王” 的开源系统,这名字挺有意思的,我还以为是什么 “卷王” 专…

洛谷题单指南-常见优化技巧-唯一的雪花 Unique Snowflakes

原题链接:https://www.luogu.com.cn/problem/UVA11572 题意解读:本质上是要计算最长连续不重复子序列的长度,典型的双指针应用。 解题思路: 通过双指针来枚举子序列,右指针指向的元素每次记录元素出现的次数,可以借助hash数组h[] 如果枚举到的元素出现次数超过1,则表示左…

BSW之——CAN

CAN总线协议 一、简介 CAN: 控制器局域网总线(CAN,Controller Area Network)是一种用于实时应用的串行通讯协议总线,它可以使用双绞线来传输信号,是世界上应用最广泛的现场总线之一。 CAN协议用于汽车中各种不同元件之间的通信,以此取代昂贵而笨重的配电线束。 该协议的…