
Spring实战
文章平均质量分 83
Coder_Boy_
主攻【Java 微服务 云原生】,涉猎 web前端 、大数据 Linux运维 、嵌入式。
目前主要从事K8S DevOps CICD 容器云平台的开发设计工作,擅长使用DDD理念设计代码架构。
在团队开发中乐于分享自己的心得与经验,常于同事讨论业务与技术问题,担任项目组长一职。
并时刻关注并学习新技术,并将所学应用于研发中,对于已经处理解决的问题,事后从源码层研究报错原因。时刻保持技术敏感度
展开
-
Spring MVC 源码- ViewResolver 组件
实现 ViewResolver、Ordered 接口,继承 WebApplicationObjectSupport 抽象类,基于 Bean 的名字获得 View 对象的 ViewResolver 实现类。文档已经讲述完了,对于 Spring MVC 中大部分的内容都有分析到,你会发现 Spring MVC 原来是这么回事, 其中涉及到 Spring 思想相关内容在努力阅读中,敬请期待~对于相同的视图名,返回的是相同的 View 对象,所以通过缓存,可以进一步提供性能。,来获取对应的 View 们。原创 2023-02-25 12:07:32 · 785 阅读 · 0 评论 -
Spring MVC 源码- LocaleResolver 组件
组件,本地化(国际化)解析器,提供国际化支持。笔者实际上没有接触过该组件,因为目前的项目大多数都已经前后端分离了,这里只是浅显的介绍了该接口.获得 Bean 名称为 "localeResolver",类型为 LocaleResolver 的 Bean ,将其设置为。如果未获得到,则获得默认配置的 LocaleResolver 实现类,调用。,实现 LocaleResolver 接口,通过检验 HTTP 请求的。组件,本地化(国际化)解析器,提供国际化支持。为空,且默认语言环境不为空,则返回默认对象。原创 2023-02-25 10:55:59 · 685 阅读 · 0 评论 -
Spring MVC 源码- RequestToViewNameTranslator 组件
获得 Bean 名称为 "viewNameTranslator",类型为 RequestToViewNameTranslator 的 Bean ,将其设置为。如果未获得到,则获得默认配置的 RequestToViewNameTranslator 实现类,调用。组件进行了分析,视图名称转换器,用于解析出请求的默认视图名。组件,视图名称转换器,用于解析出请求的默认视图名。方法,从请求中获取默认的视图名,如果获取到了则设置到 ModelAndView 对象中。方法,获得视图名,并添加前后缀(默认都是空的)。原创 2023-02-25 01:13:43 · 486 阅读 · 0 评论 -
Spring MVC 源码- HandlerExceptionResolver 组件
实现 HandlerExceptionResolver、Ordered 接口,HandlerExceptionResolver 抽象类,作为所有 HandlerExceptionResolver 实现类的。,继承 AbstractHandlerExceptionResolver 抽象类,默认 HandlerExceptionResolver 实现类,针对各种异常,设置错误响应码。的实现类没有特别多,不过也采用了组合模式,如果某个异常处理器进行处理了,也就是返回的 ModeAndView 不为。原创 2023-02-25 00:47:21 · 936 阅读 · 0 评论 -
Spring MVC 源码- HandlerAdapter 组件(五)之 HttpMessageConverter
我们只能从流中读取原始的字符串报文,或者往流中写入原始的字符串,而 Java 是面向对象编程的,字符串与 Java 对象之间的转换不可能交由开发者去实现。处理请求时,由合适的 HttpMessageConverter 消息转换器将请求报文绑定为方法中的形参对象,同一个对象就有可能出现多种不同的消息形式,比如 json 和 xml,同样,当响应请求时,方法的返回值也同样可能被返回为不同的消息形式,比如 json 和 xml。在处理 HTTP 请求的过程中,需要解析请求体,返回结果设置到响应体。原创 2023-02-24 23:19:37 · 971 阅读 · 0 评论 -
Spring MVC 源码- HandlerAdapter 组件(四)之 HandlerMethodReturnValueHandler
当然,默认还会添加其他的,例如 MappingJackson2HttpMessageConverter 为 JSON 消息格式的转换器,至于其他 HttpMessageConverter 实现类如何添加的,本文就不分析了,你知道就行。设置响应头 Accept-Ranges 为 "bytes",如果数据不为空,且请求头中的 Range 不为空,且响应码为 200,则设置状态码为 206(断点续传,客户端已下载一部分数据),这里不做过多的讲述。所以这里需要一个处理器适配器,由它去执行处理器。原创 2023-02-24 22:25:45 · 1244 阅读 · 0 评论 -
Spring MVC 源码- HandlerAdapter 组件(三)之 HandlerMethodArgumentResolver
来进行处理,如果有某一个参数解析器支持解析该方法参数,则使用它从请求体中获取到该方法参数的值,注意这里有一定的先后顺序,因为是通过 LinkedList 保存所有的实现类,排在前面的实现类则优先处理。参数解析器从请求中获取到对应的方法参数值,因为你无法确认哪个参数值对应哪个参数,所以需要先通过它从请求中解析出参数值,一一对应,然后才能调用该方法。方法,解析参数值的后置处理,空方法,子类可以覆盖,子类 PathVariableMethodArgumentResolver 会重写该方法。原创 2023-02-24 13:44:34 · 1996 阅读 · 0 评论 -
Spring MVC 源码 - HandlerAdapter 组件(二)之 ServletInvocableHandlerMethod
Spring 中的处理器的实现多变,比如用户的处理器可以实现 Controller 接口或者 HttpRequestHandler 接口,也可以用。处理器里面仅包含了方法的所有信息,如何解析参数、调用对应的方法、以及处理返回结果,它本身并不知道如何去处理,这里 Spring MVC 借助于。注意,这里获取到的 Method 对象可能是桥接方法,桥接方法:如果泛型对象,编译器则会自动生成一个桥接方法(java1.5向后兼容)HandlerAdapter 组件,处理器的适配器。返回值处理器等组件。原创 2023-02-24 00:01:55 · 526 阅读 · 0 评论 -
Spring MVC 源码 - HandlerAdapter 组件(一)之 HandlerAdapter
这里是通过一个一个的 HandlerAdapter 组件去判断是否支持该处理器,如果支持则直接返回这个 HandlerAdapter 组件,不会继续下去,所以获取处理器对应 HandlerAdapter 组件是有一定的先后顺序的,默认是HttpRequestHandlerAdapter -> SimpleControllerHandlerAdapter -> RequestMappingHandlerAdapter。我们主要先梳理好主流程,所以涉及的组件,还是先不详细解析。对象,然后设置其属性。原创 2023-02-23 23:02:40 · 954 阅读 · 0 评论 -
Spring MVC 源码 - HandlerMapping 组件(四)之 AbstractUrlHandlerMapping
在父类 WebApplicationObjectSupport 的父类 ApplicationObjectSupport 中可以看到,因为实现了 ApplicationContextAware 接口,则在初始化该 Bean 的时候会调用。至此,HandlerMapping 组件就分析到这里了,相信你对 HandlerMapping 组件有了一个深入的了解,更加的清楚 Spring MVC 是如何处理器请求的。注解这样的方式所取代。例如,我们所熟知的 @RequestMapping 等注解的方式。原创 2023-02-21 20:08:06 · 911 阅读 · 0 评论 -
Spring MVC 源码 - HandlerMapping 组件(三)之 AbstractHandlerMethodMapping
这样一来,当 Spring MVC 的 DispatcherServlet 处理请求的时候,获取到对应的 HandlerMethod 处理器,就可以通过反射执行对应的方法了。时代,我们需要编写许多的 Servlet 去处理请求,然后在 web.xml 中进行配置,而 Spring MVC 让你通过只要在类和方法上面添加。这样是不是简化了你的工作量,让你专注于业务开发。注解的方法,假设它所在的类为 UserController ,对应的方法名为 login ,则它对应的 Mapping 的名字就是。原创 2023-02-21 18:03:39 · 889 阅读 · 0 评论 -
Spring MVC 源码 - HandlerMapping 组件(二)之 HandlerInterceptor 拦截器
废弃了 WebMvcConfigurerAdapter,所以需要通过 WebMvcConfigurer 接口来添加我们的拦截器,那么在 Spring Boot 2.0+ 中是如何将 WebMvcConfigurer 添加的拦截器设置到 AbstractHandlerMapping 对象中的呢?接下来开始简单的分析。拦截器的在项目中会经常使用到,应用场景比较多,例如权限校验、参数预处理等等,上面也提供了相应的。:记录已成功执行前置处理的拦截器位置,因为已完成处理只会执行前置处理成功的拦截器,且倒序执行。原创 2023-02-21 13:35:51 · 657 阅读 · 0 评论 -
Spring MVC 源码 - HandlerMapping 组件(一)之 AbstractHandlerMapping
这里是通过一个一个的 HandlerMapping 组件去进行处理,如果找到对应 HandlerExecutionChain 对象则直接返回,不会继续下去,所以初始化的 HandlerMapping 组件是有一定的先后顺序的,默认是BeanNameUrlHandlerMapping -> RequestMappingHandlerMapping。方法,从 Spring 的上下文中,扫描已注册的 MappedInterceptor 的拦截器们,添加到。等注解的方式所取代。等注解的方式所取代。原创 2023-02-21 00:56:00 · 654 阅读 · 0 评论 -
Spring MVC 源码之MultipartResolver 组件
继承 AbstractMultipartHttpServletRequest 抽象类,基于 Servlet 3.0 的 Multipart HttpServletRequest 实现类,包含了一个。本文对 Spring MVC 处理请求的过程中使用到的 MultipartResolver 组件进行了分析,如果请求的。对象,也就是我们常用到的 MultipartFile 对象,支持对文件的操作,内部其实都是调用。集合,如果是一个简单的表单字段,那么就是一个普通的参数,将参数名和值保存起来。原创 2023-02-19 23:31:43 · 1390 阅读 · 0 评论 -
Spring MVC之 一次请求响应的过程
是如何处理请求已经有了一个整体的认识,不过在整个处理过程中涉及到的各个 Spring MVC 组件还没有进行分析,对于许多细节存在疑惑,那么接下来会对每一个 Spring MVC 组件进行分析。这一点值得我们学习。以上就是 Spring MVC 处理请求的全过程,上面的流程进行了一定的简化,主要涉及到最核心的组件,还有许多其他组件没有表现出来,不过这并不影响大家对主过程的理解。核心类,作为 Spring MVC 的核心类,承担调度器的角色,协调各个组件进行工作,处理请求,一起来揭开这神秘的面纱吧。原创 2023-02-18 23:50:42 · 921 阅读 · 0 评论 -
Spring MVC之WebApplicationContext 容器的初始化
因为spring-mvc项目,是的子项目,所以需要拉取整个工程,包含 Spring 所有的子项目。原创 2023-02-17 19:54:32 · 1121 阅读 · 0 评论 -
Spring MVC 之Tomcat启动流程
是的,前面所讲述的 Servlet 的规范,无论是 web.xml 中的配置,还是 Servlet3.0 中的 ServletContainerInitializer 和 SpringBoot 的加载流程都没有太大的关联。如果应用程序是以 war 包的方式放入 Tomcat 的 webapps 文件夹下面,那么在 Tomcat 启动时会加载 war 包,生成对应的一个文件夹,Tomcat 则会去对 webapps 文件夹下面的每一个文件夹(我们的应用程序)生成一个部署任务,去解析对应的。原创 2023-02-17 15:27:55 · 3203 阅读 · 1 评论 -
SpringIOC之应用上下文ApplicationContext
前面一系列文章都是围绕 BeanFactory 进行分析的,BeanFactory 是 Spring 底层 IoC 容器的实现,完成了 IoC 容器的基本功能。在实际的应用场景中,BeanFactory 容器有点简单,它并不适用于生产环境,我们通常会选择 ApplicationContext。ApplicationContext 就是大名鼎鼎的 Spring 应用上下文,它不仅继承了 BeanFactory 体系,还提供更加高级的功能,更加适用于我们的正式应用环境。原创 2023-02-14 23:28:39 · 558 阅读 · 0 评论 -
SpringIOC之创建Bean的核心方法doGetBean
面向资源(XML、Properties)面向注解定义的 Bean 是如何被解析成 BeanDefinition(Bean 的“前身”),并保存至 BeanDefinitionRegistry 注册中心里面,实际也是通过 ConcurrentHashMap 进行保存。Spring 底层 IoC 容器 DefaultListableBeanFactory,实现了 BeanFactory 和 BeanDefinitionRegistry 接口,这个时候它处于“就绪状态”,当我们显示或者隐式地调用。原创 2023-02-09 11:49:58 · 648 阅读 · 0 评论 -
SpringIOC之BeanDefinition 相关类型关系
我们知道Spring中Bean的配置来源很多(主要两种方式定义一个 Bean:面向资源(XML、Properties)面向注解),为了收集不同配置源,需要统一起来,所有有必要使用一个对象存储 也就是BeanDefinition,而在使用这些BeanDefinition之前,不同的BeanDefinition直接也会存在不同的依赖层级和引用关系。原创 2023-02-07 16:34:50 · 671 阅读 · 1 评论 -
Spring源码中的使用到的规则
Spring源码中使用到很多Holder类 ,列如,那么作用是什么呢?Holder类的作用我们执行一下看看:很明显,这两个方法都没能改变原始的a、b变量。上面这段代码执行时的内存单元变化大致是这样的:从这个图可以看出,执行change方法时,aa变量先是在另一个内存单元中复制了一份a变量的东西,接着在方法中一直改变的都是aa变量,因此很明显a变量从始至终都没有发生改变;原创 2023-02-06 10:05:35 · 179 阅读 · 0 评论 -
SpringIOC之@Bean 等注解的实现原理
我们了解到@Component注解(及其派生注解)标注的 Class 类都会被解析成 BeanDefinition(Bean 的“前身”)然后实例化为早期Bean,再进行Bean的属性注入,最后会被初始化成完整Bean对象(如果需要代理则会创建Bean代理对象)。而@Bean注解不是@Component的派生注解,且用于标注方法,使用方法名作为BeanName,返回值作为Bean,那么Spring 中是如何解析@Bean注解的呢?原创 2023-02-06 09:35:38 · 1511 阅读 · 0 评论 -
SpringIOC之注解与Bean生命周期的关联
Bean 是根据 BeanDefinition 配置元信息对象生成的。面向注解, 这些配置或者注解在整个Bean生命周期的作用和触发时机是什么呢。面向资源(XML、Properties)原创 2023-02-05 22:50:15 · 789 阅读 · 2 评论 -
SpringIOC之配置类注解的核心流程
个人总结:配置类注解 与 模式注解 在Spring中是核心注解 它们在Bean生命周期中的作用如下:注解(及其派生注解)标注的 Class 类都会被解析成 BeanDefinition(Bean 的“前身”),然后实例化为早期Bean,再进行Bean的属性注入,最后会被初始化成完整Bean对象(如果需要代理则会创建Bean代理对象)。对于XML配置的Bean,比注解配置的Bean,多了前期的几步:加载配置资源文件,解析资源文件 ,后面的流程一致都统一解析成 BeanDefinition。原创 2023-02-05 21:15:39 · 959 阅读 · 0 评论 -
SpringIOC之循环依赖问题思考
接下来去查找 B,初始 B 的时候又要去注入 A,又去查找 A ,由于可以通过 singletonFactories 直接拿到正在初始化的 A,那么就可以完成 B 的初始化,最后也完成 A 的初始化,这样就避免出现循环依赖。singletonFactories(三级 Map),里面保存了正在初始化的 Bean 对应的 ObjectFactory 实现类,调用其 getObject() 方法返回正在初始化的 Bean 对象(仅实例化还没完全初始化好),如果存在则将获取到的 Bean 对象并保存至。原创 2023-02-05 00:21:03 · 604 阅读 · 0 评论 -
SpringIOC之Bean的依赖注入执行逻辑
(三级 Map),里面保存了正在初始化的 Bean 对应的 ObjectFactory 实现类,调用其 getObject() 方法返回正在初始化的 Bean 对象(仅实例化还没完全初始化好)Spring 只处理单例 Bean 的字段(或 Setter)注入出现循环依赖,对于构造器注入出现的循环依赖会直接抛出异常。(一级 Map):里面保存了所有已经初始化好的单例 Bean,也就是会保存 Spring IoC 容器中所有单例的 Spring Bean。获取到的正在初始化的 Bean。原创 2023-02-04 08:30:46 · 511 阅读 · 0 评论 -
SpringIOC之Bean属性填充的逻辑
在 Bean 的实例化阶段获取到的就是一个 BeanWrapperImpl 对象,所以这里调用的就是当前 Bean 的。是 MutablePropertyValues 类型,则可能已经处理过了,否则,获取所有的属性值集合,放入。属性描述器,获取到对应的写方法,然后通过反射机制设置当前 Bean 的属性值。属性值已经转换了,则将这些属性值设置到当前 Bean 中(反射机制),如果属性值不为空,且不需要每次都处理,则设置为已转换。没有转换过,则获取所有的属性值集合,放入。设置转换后的值,避免上面的各种判断。原创 2023-02-03 21:59:59 · 575 阅读 · 0 评论 -
Nacos配置服务执行核心机制
Naco核心流程原创 2023-01-15 17:58:43 · 179 阅读 · 0 评论 -
SpringBoot自动装配执行原理图
SpringBoot核心注解核类原创 2023-01-15 17:52:50 · 256 阅读 · 0 评论 -
任务调度处理系列之 Spring源码分析-【SchedulingConfigurer实现原理】
可能的场景在做业务平台的时候我们经常会遇到,某些跟时间打交道的需要修改状态,比如说在时间区间之前,属于未生效状态,区间之内属于有效期,区间之后,属于过期,或者需要每天 每周 每月,甚至是年为单位的做一些固定的操作。通过定时任务可以通过开启定时任务来完成这些需求。我做合同管理模块,合同有未生效,已生效,已过期,三个状态,不可能每次用户登录的时候去判断这个状态,然后修改,这样做会在登录的逻辑里边耦合了合同业务逻辑,同时消耗了登录时间,不太可取。还有一些需要报表统计类的批量处理任务,任务量大,类别也.原创 2020-12-05 04:27:19 · 3276 阅读 · 0 评论 -
Spring知识体系-基础整理-思维导图(00001)
Spring支持的特性之一(跨域请求处理)原创 2020-08-15 14:20:09 · 1503 阅读 · 0 评论 -
Spring5源码分析与企业级实战—环境篇(0001)
基础环境搭建之(1)Spring5开始 采用Gradle 构建源码,所以有必要配置一下这个环境,这样才好进行Spring源码的分析工作。Gradle build tool我们参考官方文件搭建一下:https://gradle.org/install/#manually先决条件Gradle可在所有主要操作系统上运行,并且仅需要安装Java JDK或JRE版本8或更高版本。要检查,请运行java -version:$ java -versionjava version "1.8.0_1.原创 2020-08-15 12:11:19 · 264 阅读 · 0 评论