springmvc源码分析

我的历史文章整理(2017-2019)

醉酒当歌 提交于 2019-12-12 11:41:19
我的写作经历 我是一名普通的 Java 开发者,喜欢在网上分享一些个人的故事以及工作中遇到的问题,自 2017 年开始用 “十三” 这个网名在各个博客平台发表文章,常活跃的平台有 CSDN、博客园、掘金、简书等网站,有免费的文章,也有付费的专栏,前前后后大概有 200 篇文章,算是我的写作经历。 从零开始搭建一个精美且实用的管理后台 SSM 搭建精美实用的管理系统 导读:自己动手实现 JavaWeb 后台管理系统 第01课:Spring MVC+ Spring + Mybatis “三大框架”介绍 第02课:前期准备工作及基础环境搭建 第03课:三大框架的整合 第04课:Tomcat 8 安装部署及功能改造 第05课:产品设计之搭建精美实用的后台管理系统 第06课:前端选型 AdminLTE3 第07课:登录模块的系统设计和实现 第08课:使用 JqGrid 插件实现分页功能 第09课:弹框组件整合——完善添加和修改功能 第10课:图片管理模块 第11课:多图上传与大文件分片上传、断点续传 第12课:文件导入导出功能 第13课:富文本信息管理模块 第14课:SweetAlert 插件整合及搜索功能实现 第15课:项目发布——Linux 命令及发布流程 第16课:项目优化篇之日志输出 第17课:项目优化之单元测试 第18课:项目优化之数据库连接池 第19课:项目优化之 Druid

SpringMVC之自动注入Request对象

安稳与你 提交于 2019-12-09 02:31:42
前几天看了领导写的一段代码,在Controller中注入了HttpServletRequest,形式如下所示: @RestController public class AutowiredRequestController { @Autowired private HttpServletRequest request; } 当时看到了这一段代码,首先想到的是AutowiredRequestController是一个singleton的bean,HttpServletRequest是一个变化的共享变量,每个请求对象都是不一样的,这样写不会有线程安全问题吗?带着疑问去翻了翻SpringMVC的源码,结论是:不会有线程安全问题!!!不会有线程安全问题!!!!不会有线程安全问题!!!下面我们来分析一下: 在前面的文章中我们简单的分析过SpringMVC的上下文初始化过程( SpringMVC之浅析上下文初始化(一) 和 SpringMVC之浅析上下文初始化(二) ),SpringMVC环境中的父上下文时:XmlWebApplicationContext。下面我们先看一下XmlWebApplicationContext的UML类图(去掉了一些暂时无关的): 之前也说过会调用AbstractApplicationContext中的refresh方法进行Bean的组装初始化的过程

通俗易懂SpringMVC整体框架理解

空扰寡人 提交于 2019-12-09 01:40:33
最近又重新温习了一下前台SpringMVC框架,能够从整体上对SpringMVC有一个全局的认识。在这里也总结一下,为那些即将学习SpringMVC的亲们,做一个很好的开端吧! 1. SpringMVC整体框架图 学习某一种技术的话,要能够从宏观上把握一下这种技术的大致实现原理,然后才开始刨根问底的学习,这种技术的细节,这样会快也一些。首先从宏观上把控一些知识点之间的联系,学习起来更有连贯性,下面就先从SpringMVC的框架图来整体分析一下。 上图就是SpringMVC整体的框架图,就这么几个部分。下面来着重的分析一下,整个过程中的流转。 1.首先是用户发送请求,比如在浏览器中输入http://localhost:8080/SpringTest/login 2.用户的请求就发送到了DispatcherServlet也就是前端控制器,这个东西是一个Servlet的实现,用来干什么呢?用来接收用户的请求,然后响应结果,相当于一个转发器,它的配置如下 [html] view plain copy print ? < span style = "font-family:Comic Sans MS;font-size:18px;" > <!-- 自此请求已交给Spring Web MVC框架处理,因此我们需要配置Spring的配置文件,默认DispatcherServlet会加载WEB

Spring与SpringMVC的容器关系分析

强颜欢笑 提交于 2019-12-03 20:09:07
Spring 与 SpringMVC 的容器关系分析 结论: Spring ( springContext.xml )容器配置,排除所有 @controller 的 Bean < context :component-scan base-package ="com.service,com.util,com.dao" > SpringMVC(springmvc.xml) 容器配置,让其只包括 @controller 的 Bean < context :component-scan base-package ="com.controller.*" /> ****************************************************************************** 在 Spring 整体框架的核心概念中,容器是核心思想,就是用来管理 Bean 的整个生命周期的,而在一个项目中,容器不一定只有一个, Spring 中可以包括多个容器,而且容器有上下层关系,目前最常见的一种场景就是在一个项目中引入 Spring 和 SpringMVC 这两个框架,其实就是 2 个容器, Spring 是根容器, SpringMVC 是其子容器,并且在 Spring 根容器中对于 SpringMVC 容器中的 Bean 是不可见的,而在 SpringMVC

java学习笔记

人走茶凉 提交于 2019-12-03 16:41:32
源码分析专题 : 常用设计模式 : Proxy : 代理模式 Factory : 工厂模式 Singleton : 单例模式 Delegate : 委派模式 Strategy : 策略模式 Prototype : 原型模式 Template : 模板模式 Spring5 : IOC容器设计原理及高级特性 AOP设计原理 FactoryBean与BeanFactory Spring事务处理机制 基于SpringJDBC手写ORM框架 SpringMVC九大组件 手写实现SpringMVC框架 SpringMVC与Struts2对比分析 Spring5新特性 MyBatis : 代码自动生成器 MyBatis关联查询,嵌套查询 缓存使用场景及选择策略 Spring 集成下的SqlSession与Mapper MyBatis的事务 来源: https://www.cnblogs.com/bubble1994/p/11803057.html

关于SpringMVC返回数据带斜杠字符串问题之解决方案

匿名 (未验证) 提交于 2019-12-03 00:43:02
常用SpringMVC的基本都知道,@RestController和@ResponseBody加上了都会返回json数据。它们的区别主要是注解方面,一个是类级别的一个是方法级别。 之前我们比较喜欢使用@ResponseBody,后来觉得重复性太多了,特别是使用swagger以后,一个方法上面关注解就上了4到5层,为了减少这些繁杂的过程,我们就采取简洁策略,因为都是基于前后端分离开发,前端展示也不打算使用诸如jsp、freemarke、volocity等模板语言。直接上手html,当然主要是以ajax的方式进行交互。 先列举这么几个情况?通常情况下,类上面有对应的RestController注解或者是你的类上是@Controller注解,并在每个方法上面加上@ResponseBody。正常是应该返回JSON数据的。通过POSTMAN测试或者Jmeter。 关于@RestController和@ResponseBody源码解析可以参考我的这篇文章: 前后端交互之封装Ajax+SpringMVC源码分析 当然有的时候没有返回的话,根据你使用而定比如使用FastJSON却没有返回对应的JSON数据,可通过在SpringMVC配置文件加上如下内容解决: <!-- FastJson注入 --> <mvc:annotation-driven> <mvc:message-converters

Spring和SpringMVC父子容器关系

匿名 (未验证) 提交于 2019-12-03 00:32:02
  最近由于项目的包扫描出现了问题,在解决问题的过程中,偶然发现了Spring和SpringMVC是有父子容器关系的,而且正是因为这个才往往会出现包扫描的问题,我们在此来分析和理解Spring和SpringMVC的父子容器关系并且给出Spring和SpringMVC配置文件中包扫描的官方推荐方式。   在Spring整体框架的核心概念中,容器是核心思想,就是用来管理Bean的整个生命周期的,而在一个项目中,容器不一定只有一个,Spring中可以包括多个容器,而且容器有上下层关系,目前最常见的一种场景就是在一个项目中引入Spring和SpringMVC这两个框架,那么它其实就是两个容器,Spring是父容器,SpringMVC是其子容器,并且在Spring父容器中注册的Bean对于SpringMVC容器中是可见的,而在SpringMVC容器中注册的Bean对于Spring父容器中是不可见的,也就是子容器可以看见父容器中的注册的Bean,反之就不行。   我们可以使用统一的如下注解配置来对Bean进行批量注册,而不需要再给每个Bean单独使用xml的方式进行配置。 < context:component-scan base-package ="com.hafiz.www" />   从Spring提供的参考手册中我们得知该配置的功能是扫描配置的base-package包下的所有使用了

SpringMVC框架 课程笔记

家住魔仙堡 提交于 2019-12-02 22:33:52
SpringMVC 框架 课程笔记 第0章 SpringMVC框架的核心内容 1.SpringMVC 概述 2.SpringMVC 的 HelloWorld 3. 使用 @RequestMapping 映射请求 4. 映射请求参数 & 请求头 5. 处理模型数据 6. 视图和视图解析器 7.RESTful CRUD 8.SpringMVC 表单标签 & 处理静态资源 9. 处理 JSON :使用 HttpMessageConverter 10. 文件的上传 11. 使用拦截器 12.SpringMVC 运行流程 13. 在 Spring 的环境下使用 SpringMVC 第1章 SpringMVC 概述 1.1 SpringMVC 概述 1) Spring 为展现层提供的基于 MVC 设计理念的优秀的 Web 框架,是目前最主流的 MVC 框架之一 2)Spring3.0 后全面超越 Struts2,成为最优秀的 MVC 框架。 3)Spring MVC 通过一套 MVC 注解,让 POJO 成为处理请求的控制器,而无须实现任 何接口。 4)支持 REST 风格的 URL 请求。 5)采用了松散耦合可插拔组件结构,比其他 MVC 框架更具扩展性和灵活性。 1.2 SpringMVC是什么 1)一种轻量级的、基于MVC的Web层应用框架。偏前端而不是基于业务逻辑层

Spring容器启动源码分析

孤者浪人 提交于 2019-12-02 22:13:53
1. 前言   最近搭建的工程都是基于SpringBoot,简化配置的感觉真爽。但有个以前的项目还是用SpringMvc写的,看到满满的配置xml文件,却有一种想去深入了解的冲动。折腾了好几天,决心去写这篇关于Spring启动的博客,自己是个刚入职的小白,技术水平有限,也是硬着头皮看源码去Debug,很多不懂的地方还请谅解! 2. 概述   先给出几个让我头皮发麻的概念: web容器,Spring容器,SpringMvc容器   容器就是管理对象的地方,例如web容器就是管理servlet的地方,Spring容器就是管理Service,dao等Bean的地方,SpringMvc就是管理Controller等bean的地方(下文会做解释)。一个SpringMvc项目的启动离不开上述三个容器。所以这就是这篇文章的讲点,各个容器的启动过程解析。 3. Web容器初始化过程    官方文档是对于Web容器初始化时是这样描述的(英文不懂,已翻译成中文)   1. 部署描述文件(web.xml)中的<listener>标记的监听器会被创建和初始化   2. 对于实现了ServletContextListener的监听器,会执行它的初始化方法 contextInitialized()   3. 部署描述文件中的<filter>标记的过滤器会被创建和初始化,调用其init()方法   4.

SpringMvc启动源码解析

寵の児 提交于 2019-12-02 11:31:08
1. 前言   上篇文章介绍了Spring容器的初始化 https://www.cnblogs.com/xiaobingblog/p/11738747.html ,接下来介绍SpringMvc容器的初始化 2. 初始化化过程   上文讲过一个Web项目的启动在加载listener、fliter初始化后,再进行servlet初始化。那SpringMvc如何与Servlet联系起来?看web.xml配置文件,有一个专门配置SpringMvc的servlet,就是DispatcherServlet。看下DispatcherServlet类继承关系   如上图,DispatcherServlet本质上是一个Servlet。DispatcherServlet类的设计很巧妙,上层父类不同程度的实现了相关接口的部分方法,并留出了相关方法用于子类覆盖,将不变的部分统一实现,将变化的部分预留方法用于子类实现。对Servlet有一定了解的,Servlet初始化会首先调用init()方法。子类最后重写init()的是HttpServletBean,所以最开始对HttpServletBean的init()方法进行分析   PropertyValues主要解析web.xml定义中<servlet>元素的子元素<init-param>中的参数值。见上图,有一个键值对就是SpringMvc的配置文件。bw