Spring工作原理

2023-10-26

Spring工作原理

Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。

  • 目的:解决企业应用开发的复杂性
  • 功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
  • 范围:任何Java应用

Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。

框架特征

轻量——从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。

控制反转——Spring通过一种称作控制反转(IoC)的技术促进了低耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。

面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。

容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。

框架——Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。

MVC——Spring的作用是整合,但不仅仅限于整合,Spring 框架可以被看做是一个企业解决方案级别的框架。客户端发送请求,服务器控制器(由DispatcherServlet实现的)完成请求的转发,控制器调用一个用于映射的类HandlerMapping,该类用于将请求映射到对应的处理器来处理请求。HandlerMapping 将请求映射到对应的处理器Controller(相当于Action)在Spring 当中如果写一些处理器组件,一般实现Controller 接口,在Controller 中就可以调用一些Service 或DAO 来进行数据操作 ModelAndView 用于存放从DAO 中取出的数据,还可以存放响应视图的一些数据。 如果想将处理结果返回给用户,那么在Spring 框架中还提供一个视图组件ViewResolver,该组件根据Controller 返回的标示,找到对应的视图,将响应response 返回给用户。

体系结构

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Spring 有可能成为所有企业应用程序的一站式服务点,Spring 是模块化的,Spring 框架提供约 20 个模块,可以根据应用程序的要求来使用。
在这里插入图片描述
核心容器
核心容器由spring-core,spring-beans,spring-context,spring-context-support和spring-expression(SpEL,Spring表达式语言,Spring Expression Language)等模块组成,它们的细节如下:

  • spring-core 模块提供了框架的基本组成部分,包括 IoC 和依赖注入功能。
  • spring-beans 模块提供 BeanFactory,工厂模式的微妙实现,它移除了编码式单例的需要,并且可以把配置和依赖从实际编码逻辑中解耦。
  • context 模块建立在由core和 beans 模块的基础上建立起来的,它以一种类似于JNDI注册的方式访问对象。Context模块继承自Bean模块,并且添加了国际化(比如,使用资源束)、事件传播、资源加载和透明地创建上下文(比如,通过Servelet容器)等功能。Context模块也支持Java EE的功能,比如EJB、JMX和远程调用等。ApplicationContext接口是Context模块的焦点。spring-context-support提供了对第三方库集成到Spring上下文的支持,比如缓存(EhCache, Guava, JCache)、邮件(JavaMail)、调度(CommonJ, Quartz)、模板引擎(FreeMarker, JasperReports, Velocity)等。
  • spring-expression模块提供了强大的表达式语言,用于在运行时查询和操作对象图。它是JSP2.1规范中定义的统一表达式语言的扩展,支持set和get属性值、属性赋值、方法调用、访问数组集合及索引的内容、逻辑算术运算、命名变量、通过名字从Spring IoC容器检索对象,还支持列表的投影、选择以及聚合等。

它们的完整依赖关系如下图所示:
在这里插入图片描述
数据访问/集成
数据访问/集成层包括 JDBC,ORM,OXM,JMS 和事务处理模块,它们的细节如下:
(注:JDBC=Java Data Base Connectivity,ORM=Object Relational Mapping,OXM=Object XML Mapping,JMS=Java Message Service)

  • JDBC 模块提供了JDBC抽象层,它消除了冗长的JDBC编码和对数据库供应商特定错误代码的解析。

  • ORM 模块提供了对流行的对象关系映射API的集成,包括JPA、JDO和Hibernate等。通过此模块可以让这些ORM框架和spring的其它功能整合,比如前面提及的事务管理。

  • OXM 模块提供了对OXM实现的支持,比如JAXB、Castor、XML Beans、JiBX、XStream等。

  • JMS 模块包含生产(produce)和消费(consume)消息的功能。从Spring 4.1开始,集成了spring-messaging模块。

  • 事务模块为实现特殊接口类及所有的 POJO 支持编程式和声明式事务管理。(注:编程式事务需要自己写beginTransaction()、commit()、rollback()等事务管理方法,声明式事务是通过注解或配置由spring自动处理,编程式事务粒度更细)

Web
Web 层由 Web,Web-MVC,Web-Socket 和 Web-Portlet 组成,它们的细节如下:

  • Web 模块提供面向web的基本功能和面向web的应用上下文,比如多部分(multipart)文件上传功能、使用Servlet监听器初始化IoC容器等。它还包括HTTP客户端以及Spring远程调用中与web相关的部分。。

  • Web-MVC 模块为web应用提供了模型视图控制(MVC)和REST Web服务的实现。Spring的MVC框架可以使领域模型代码和web表单完全地分离,且可以与Spring框架的其它所有功能进行集成。

  • Web-Socket 模块为 WebSocket-based 提供了支持,而且在 web 应用程序中提供了客户端和服务器端之间通信的两种方式。

  • Web-Portlet 模块提供了用于Portlet环境的MVC实现,并反映了spring-webmvc模块的功能。

其他
还有其他一些重要的模块,像 AOP,Aspects,Instrumentation,Web 和测试模块,它们的细节如下:

  • AOP 模块提供了面向方面的编程实现,允许你定义方法拦截器和切入点对代码进行干净地解耦,从而使实现功能的代码彻底的解耦出来。使用源码级的元数据,可以用类似于.Net属性的方式合并行为信息到代码中。

  • Aspects 模块提供了与 AspectJ 的集成,这是一个功能强大且成熟的面向切面编程(AOP)框架。

  • Instrumentation 模块在一定的应用服务器中提供了类 instrumentation 的支持和类加载器的实现。

  • Messaging 模块为 STOMP 提供了支持作为在应用程序中 WebSocket 子协议的使用。它也支持一个注解编程模型,它是为了选路和处理来自 WebSocket 客户端的 STOMP 信息。

  • 测试模块支持对具有 JUnit 或 TestNG 框架的 Spring 组件的测试。

工作原理

在这里插入图片描述

Spring内部最核心的是IOC;动态注入,创建对象不用new了,可以自动生产,这利用Java的反射,反射就是在运行时动态地去创建、调用对象。Spring就是在运行时,根据xml Spring的配置文件来动态地创建对象,调用对象里的方法 。

Spring还有一个核心就是AOP,即面向切面编程,可以为某一类对象进行监督和控制(也就是在调用这类对象的具体方法的前后去调用你指定的模块)从而达到对一个模块扩充的功能。这些都是通过 配置类达到的。

Spring目的就是让对象与对象(模块与模块)之间的关系没有通过代码来关联,都是通过配置类说明管理的(Spring根据这些配置,内部通过反射去动态的组装对象)

Spring是一个容器,凡是在容器里的对象才会有Spring所提供的这些服务和功能。

IoC
概念:控制权由对象本身转向容器;由容器根据配置文件去创建实例并创建各个实例之间的依赖关系 。
核心:bean工厂;在Spring中,bean工厂创建的各个实例称作bean

静态代理
针对每个具体类分别编写代理类;
针对一个接口编写一个代理类;

动态代理
针对一个方面编写一个InvocationHandler,然后借用JDK反射包中的Proxy类为各种接口动态生成相应的代理类

不用写代理类,虚拟机根据真实对象实现的接口产生一个类,通过类实例化一个动态代理,在实例化动态代理时将真实对象及装备注入到动态代理中,向客户端公开的是动态代理,当客户端调用动态代理方法时,动态代理根据类的反射得到真实对象的Method,调用装备的invoke方法,将动态代理、 Method、方法参数传与装备的invoke方法,invoke方法在唤起method方法前或后做一些处理。

产生动态代理的类: java.lang.refect.Proxy

装备必须实现InvocationHandler接口实现invoke方法

反射
通过类说明可以得到类的父类、实现的接口、内部类、构造函数、方法、属性并可以根据构造器实例化一个对象,唤起一个方法,取属性值,改属性值。

spring的三种注入方式

  • setter
  • interface
  • constructor

spring的核心接口及核类配置文件

  • FactoryBean:工厂bean主要实现ioc/di
  • ApplicationContext ac=new FileXmlApplicationContext(“applicationContext.xml”);
  • Object obj=ac.getBean(“id值”);

Spring框架的7个模块
在这里插入图片描述
Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式,组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:

  • 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。

  • Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。

  • Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。

  • Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。

  • Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。

  • Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。

  • Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。

Spring 框架的功能可以用在任何 J2EE 服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定 J2EE 服务的可重用业务和数据访问对象。毫无疑问,这样的对象可以在不同 J2EE 环境 (Web 或 EJB)、独立应用程序、测试环境之间重用。

spring 容器的启动加载流程

1.首先解析 spring.xml 配置文件,把其中 解析为 BeanDefinition, 存入beanFactory。把 BeanDefinition 中的定义读取到一个map集合中管理起来了,但还没有创建 bean 的单例对象。

2.执行beanFactory的后处理器

3.接下来 由 beanFactory 创建每个类对应的单例对象, 利用了反射根据类名创建每个类的实例对象(构造,初始化方法)

4.执行 bean 的后处理器, 它其中有两个方法,会在 bean 的初始化方法前后被调用

5.会把这些结果 存入 beanFactory 的 singletonObjects 这样一个map集合里:userService -> userService对象

6.执行依赖注入,主要为了解决循环引用问题。

执行流程

在这里插入图片描述
用户发起请求到前端控制器(DispatcherServlet),该控制器会过滤出哪些请求可以访问Servlet、哪些不能访问。就是url-pattern的作用,并且会加载springmvc.xml配置文件。

前端控制器会找到处理器映射器(HandlerMapping),通过HandlerMapping完成url到controller映射的组件,简单来说,就是将在springmvc.xml中配置的或者注解的url与对应的处理类找到并进行存储,用map这样的方式来存储。HandlerMapping有了映射关系,并且找到url对应的处理器,HandlerMapping就会将其处理器(Handler)返回,在返回前,会加上很多拦截器。

DispatcherServlet拿到Handler后,找到HandlerAdapter(处理器适配器),通过它来访问处理器,并执行处理器。执行处理器处理器会返回一个ModelAndView对象给HandlerAdapter通过HandlerAdapter将ModelAndView对象返回给前端控制器(DispatcherServlet)前端控制器请求视图解析器(ViewResolver)去进行视图解析,根据逻辑视图名解析成真正的视图(jsp),其实就是将ModelAndView对象中存放视图的名称进行查找,找到对应的页面形成视图对象返回视图对象到前端控制器。

视图渲染,就是将ModelAndView对象中的数据放到request域中,用来让页面加载数据的。通过第8步,通过名称找到了对应的页面,通过第10步,request域中有了所需要的数据,那么就能够进行视图渲染了。最后将其返回即可。

单例模式和多例模式

在Spring中,bean可以被定义为两种模式:prototype(多例)和singleton(单例)

singleton(单例):只有一个共享的实例存在,所有对这个bean的请求都会返回这个唯一的实例。

prototype(多例):对这个bean的每次请求都会创建一个新的bean实例,类似于new。

Spring bean 默认是单例模式。

Spring的controller默认是单例模式。

Spring的bean作用域有5个:

  • singleton:单例模式,当spring创建百applicationContext容器的时候,spring会初始化所有的该度作用域实例,加上lazy-init就可以避免预处理。

  • prototype:原型模式,每次通过getBean获取该bean就会产生一个新的实例,创建后spring将不再对齐进行管理。

  • request:每次请问求都会产生一个新的实例,和prototype不同的是,创建以后spring依然在监听。

  • session:每次会话,同上答。

  • Spring的controller默认是单例模式,原因有二:
    (1)为了性能:单例不用每次都创建
    (2)不需要多例:只要controller中不定义属性,那么单例完全是回安全可用的,如果定义了,那单例肯定会出现竞争访问答;非要定义,则通过注解@Scope(“prototype”),将其设置为多例模式。

参考文章:
spring
Spring 体系结构
spring原理
Spring执行流程

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring工作原理 的相关文章

随机推荐

  • 如何修改安卓系统为自己的云服务器,安卓手机改装云服务器

    安卓手机改装云服务器 内容精选 换一换 本节操作介绍华为云上云服务器的跨账号跨区域迁移 建议采用镜像迁移方式 服务器迁移的常见场景与常用的迁移方式请参考迁移的背景知识 跨账号跨区域迁移的方法请参考方案介绍常见的服务器迁移场景包括物理服务器与
  • 【论文精读】Grounded Language-Image Pre-training(GLIP)

    一 背景 https arxiv org abs 2112 03857 https github com microsoft GLIP 这篇论文做的任务是phrase grounding 属于visual grounding的一种 phra
  • MySQL 修改默认值

    alter TABLE tableName alter COLUMN columnName set default defaultValue
  • 电阻式湿度传感器原理

    电阻式湿度传感器是利用湿敏元件的电气特性 如电阻值 随湿度的变化而变化的原理进行湿度测量的传感器 湿敏元件一般是在绝缘物上浸渍吸湿性物质 或者通过蒸发 涂覆等工艺制各一层金属 半导体 高分子薄膜和粉末状颗粒而制作的 在湿敏元件的吸湿和脱湿过
  • 大模型应用落地实践:2大路径、3大痛点、5大革命、6大预判!

    省时查报告 专业 及时 全面的行研报告库 省时查方案 专业 及时 全面的营销策划方案库 免费下载 2023年8月份全网热门报告合集 ChatGPT提词示例 让你的ChatGPT聪明100倍 超百页干货资料 AI应用的难点 痛点与未来 202
  • 双端队列,以顺序表实现双端队列,在队头和队尾添加删除元素

    include
  • opencv之kmeans原理与分割实例

    opencv之K Means原理与实现方法 C 和python版本 KMeans原理 今天记录一下opencv中kmeans中的原理以及图像分割的一个实例 K Means是对数据进行分类的算法 属于无监督学习的一种 首先需要确定对图像进行类
  • 关于QT多界面切换

    1 新增一窗体文件 会自动生成ui1 cpp ui1 h ui1 ui这三个文件 可以进行设计 绑定ui中的控件与数据模型 比如ui gt lable setText string 2 再增加一个UI文件 ui2 也会生成相应的 同上 3
  • 原本是list类型,pandas读入后变成str、obejct等其他的类型,恢复成list,并进行数据炸裂explode操作

    文章目录 本文章拟解决问题 不是这些问题请绕路 一 需求 二 操作步骤 1 从数据库中读入数据 读入的原始数据如图 2 将数据炸裂 将JSON列表拆分 一个JSON对象一行 1 具体的代码过程 踩坑 因为pandas读入数据 将 JSON列
  • XTUOJ 1176 I Love Military Chess(模拟)

    I Love Military Chess Accepted 45 Submit 141 Time Limit 1000 MS Memory Limit 65536 KB 题目描述 陆军棋 又称陆战棋 简称军棋 是中国近代的一种两人棋类 设
  • Niantic CEO访谈:元宇宙、AR眼镜和公司发展史

    Meta宣布转型元宇宙社交平台后 人们一度觉得VR是元宇宙的未来 与此同时 一些AR公司表示不服 认为AR在元宇宙的布局更超前 尤其是Snap Niantic等较成熟的移动端AR公司 对于元宇宙有各自不同的看法和规划 比如 此前Nianti
  • 下载、安装IntelliJ IDEA

    文章目录 一 下载IntelliJ IDEA 二 安装IntelliJ IDEA 三 配置主题与插件 1 设置界面主题 2 配置缺省插件 3 配置特色插件 四 设置IntelliJ IDEA 1 设置编译器用鼠标滚鼠来缩放字号 2 设置编辑
  • uml交互图

    交互图用来描述系统中的对象是如何进行相互作用的 即一组对象是如何进行消息传递的 当交互图建模时 通常既包括对象 每个对象都扮演某一特定的角色 又包括消息 每个消息都代表对象之间的通信活动 并导致一定的动作发生 关键字 对象 顺序 消息 顺序
  • 7.13字节跳动模拟面试

    GDB调试常见命令 进入GDB 取消联系 插入端点 gdb help 查看命令帮助 具体命令查询在gdb中输入help 命令 简写h gdb run 重新开始运行文件 run text 加载文本文件 run bin 加载二进制文件 简写r
  • 【TODO】2023年秋招笔试未竞

    2023年秋招笔试没做完的题 腾讯20230326笔试三道 米哈游20230813笔试第三题 网易雷火0820第2 3 4题 第三题 深信服0912B卷3 4题 第三题 背包装满最小数量 第四题 腾讯0915重考最后一道 字节0917秋招第
  • 5.xaml RadioButton按钮

    1 运行图 2 运行源码 a Xaml源码
  • 基于面部视觉的疲劳检测-哈欠

    基于视觉的疲劳检测可以认为大致分为三个部分 点头 哈欠 眨眼 分别为姿态 嘴部特征 眼部特征 本文主要介绍哈欠的测定方法 首先研究了陈博士 基于可拓学与面部视觉 一文 他提出一种基于特征点曲线拟合的嘴唇内轮廓检测方法 先对嘴巴进行粗定位 然
  • Removable singularity

    In complex analysis a removable singularity of a holomorphic function is a point at which the function is undefined but
  • darknet 网络构建过程

    整个网络的构建从load network cfgfile weightfile clear 函数开始 从cfg文件中读取网络配置文件 分配好内存 加载预训练好的权重 network load network char cfg char we
  • Spring工作原理

    Spring工作原理 Spring框架是由于软件开发的复杂性而创建的 Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情 然而 Spring的用途不仅仅限于服务器端的开发 从简单性 可测试性和松耦合性角度而言 绝大