Spring3.1.0实现原理分析
文章平均质量分 91
分析spring ioc,aop,mvc,dao,boot等的实现原理,帮助你清清楚楚,明明白白使用spring。
叶琎宇
系统架构设计师
展开
-
Spring实现原理分析(二十六).Spring Boot关于嵌入式servlet容器
大家好!用过spring boot的开发者会有种很直观的感受,就是发现servlet容器“消失了”,从而来带一丝丝的空虚感。之前开发web项目,都是把程序写完后部署到servlet容器(比如Tomcat),但是使用spring boot开发项目,写完程序后直接就能运行了,好神奇! 其实呢,这是因为spring boot使用了嵌入式servlet容器的关系,话说Jetty好多...原创 2017-12-04 19:05:41 · 1553 阅读 · 0 评论 -
Spring实现原理分析(二十五).Spring Boot如何把application.*中的配置数据转换成对象
大家好!用过spring boot的人应该都知道“application.properties”和“application.yml”这两个配置文件吧,最常见的就是在这两个文件里面配置数据库连接信息。那么,今天我要向大家揭秘,spring boot是何时加载它们,以及如何应用配置文件的过程。原创 2017-12-02 14:21:57 · 1277 阅读 · 1 评论 -
Spring实现原理分析(二十四).Spring Boot实现原理分析
我们知道spring boot最为人津津乐道的是大量减轻了配置工作量,只要有一个被@SpringBootApplication注解的启动类就可以运行。就像生命的孕育过程,从一个小小的细胞变成五脏俱全的新生儿,启动类之所以是启动类,本质是因为它被@SpringBootApplication注解了,因此@SpringBootApplication就是那个蕴含了强大生命力的细胞。那么,对@SpringBootApplication注解的解析是发生的什么时候,由谁完成的呢?答案是发生在spring启动过程中对容器的原创 2017-11-10 23:00:28 · 8090 阅读 · 0 评论 -
Spring3.1.0实现原理分析(二十三).Dao事务分析之Hibernate事务管理器
大家好,今天我们简单聊下Spring事务管理跟Hibernate相关的部分。原创 2017-09-02 13:36:26 · 611 阅读 · 0 评论 -
Spring3.1.0实现原理分析(二十二).Dao事务分析之事务管理器DataSourceTransactionManager
大家好,开篇先来谈谈spring事务的优点吧,即spring事务的存在价值。首先它提供了非侵入式编码的事务实现,这个是通过aop实现的,具体的实现过程之前也写博客分析了。 另外,spring还提供了一套标准的事务管理工作流程。简单的说,事务管理一共可分为三个步骤,分别是初始化事务、提交事务、回滚事务,然后每个步骤又可细分为若干小步骤。spring事务工作流相当于为用户屏蔽了具体orm框架的底层处理逻辑,基于spring开发的程序,即便更换了orm框架,即便从本地事务切换到全局事务,也只需要简单原创 2017-08-25 22:19:22 · 31205 阅读 · 3 评论 -
Spring3.1.0实现原理分析(二十一).Dao事务分析之集成MyBatis
大家好,这篇博客我想分析下Spring是如何集成myBatis的,下篇博客分析集成后DataSourceTransactionManager事务管理的完整流程。spring集成mybatis,spring主要扮演了两个角色,原料供应商和事务管理者,第一个角色是必须扮演的,第二个角色可选,事务也可以由mybatis自己管理。为什么说第一个角色叫原料供应商呢?因为spring想驱动mybatis工作,要给它提供必须的原材料,其中有数据源和配置。mybatis获得了数据源和配置后,就可以生产出自己的Default原创 2017-08-19 14:02:54 · 783 阅读 · 0 评论 -
Spring3.1.0实现原理分析(二十).Dao事务分析之非入侵式编码
大家好,从这篇博客开始我们分析下Spring的事务模块。Spring事务的其中一个优点是非入侵式的编码,那么非入侵是怎么实现的呢?其实就是通过Spring Aop实现的。关于AOP我之前写过两篇博客,大家最好先看下,对于理解本文有帮助。 下面是一个Spring事务的例子,在之前分析AOP的博客中我也举过一个例子,并且详细分析了每个Bean对象的创建过程。所以下面这个例子关于Bean的创建我只是简单把几个关键点写一下。原创 2017-08-10 22:22:05 · 776 阅读 · 0 评论 -
Spring3.1.0实现原理分析(十九).MVC异常处理
大家好,今天谈谈spring mvc的异常处理架构,应该说异常处理也是mvc框架的一个不可或缺的基本功能。那么在什么情况下会调用异常处理器呢,在处理器处理请求出现异常的情况下会调用异常处理器执行善后事宜。用伪代码来表述下,基本上是这样的模型。try{ 处理请求 } catch{ 调用异常处理器 }。原创 2017-07-16 11:47:10 · 479 阅读 · 0 评论 -
Spring3.1.0实现原理分析(十八).MVC处理器和处理器适配器
大家好,我们之前介绍过处理器映射,一个request请求对象经过处理器映射解析后可以获得执行链对象(若干个拦截器加一个处理器),处理器是用来返回应答数据的,而处理器适配器的作用是调用处理器。在spring mvc中默认的处理器映射是“ RequestMappingHandlerMapping”,其返回的处理器是“HandlerMethod”,驱动该处理器工作的处理器适配是“RequestMappingHandlerAdapter”。原创 2017-07-12 17:33:45 · 631 阅读 · 0 评论 -
Spring3.1.0实现原理分析(十七).MVC请求处理方法参数解析器和返回值解析器
大家好,通过我之前的分析可以知道一个request请求经过处理器映射对象(RequestMappingHandlerMapping)处理后,可以获得执行链对象,所谓执行链就是一堆拦截器加一个HandlerMethod对象。那么HandlerMethod是什么呢?它主要是对请求处理方法的封装,我们可以看下这个类的定义就能明白。原创 2017-07-03 22:00:31 · 764 阅读 · 0 评论 -
Spring3.1.0实现原理分析(十六).MVC数据绑定器
大家好,今天我们分析下数据绑定器(DataBinder),DataBinder是用来干嘛的呢?是用来给bean属性赋值的,并且还提供了校验bean属性值的功能。分析它的实现原理会涉及到多个spring模块的功能,具体有“属性访问器”、“验证器”、“类型转换”、“国际化”。 这些模块我都写过专门的博客对它们进行分析(大家可以找下)。如果说上述各模块是左勾拳或右勾拳的话,那么DataBinder就是一套组合拳,因为DataBinder就是对其它模块的综合运用。原创 2017-06-27 22:03:40 · 2226 阅读 · 0 评论 -
Spring3.1.0实现原理分析(十五).MVC验证器模块
大家好,今天我们分析下Spring的验证器模块(Validator),照理说验证器模块并非专用于web应用,但是通常还是在web应用中使用,所以我们还是在MVC这个大主题中讨论验证器模块吧。spring验证器验证什么东西呢?用于验证对象的各属性值是否符合要求,如取值范围要求、格式要求、长度要求等等。验证器在什么时候执行验证呢?在对象各属性被赋值之后。验证器是手动触发还是自动触发?手动,因为校验规则属于业务逻辑范畴,spring不会强迫用户必须执行验证。原创 2017-06-25 22:36:23 · 842 阅读 · 0 评论 -
Spring3.1.0实现原理分析(十四).MVC之处理器映射
大家好,今天我们分析下处理器映射,这个功能是MVC框架所应具备的基本功能。那么,什么是处理器映射呢,是指根据一套规则获取处理本次request请求的执行链对象,它是连接url请求和执行链对象的桥梁。执行链又是什么东东呢?无论是spring mvc还是struts2,执行链往往就是若干个拦截器加一个处理请求的方法对象(又被称为处理器)。原创 2017-06-18 22:33:29 · 1165 阅读 · 0 评论 -
Spring3.1.0实现原理分析(十三).MVC请求映射信息RequestMappingInfo详解
大家好,原本是打算先分析spring mvc的处理器映射接口的(HandlerMapping),但是发现其中的请求映射信息对象(RequestMappingInfo)特别重要,所以就决定专门写篇博客介绍请求映射信息对象,对于RequestMappingInfo有概念的读者可以先看这篇博客,其他读者可以等下篇博客,然后再回头看这篇。 RequestMappingInfo是什么样的东西呢?通常我们使用spring mvc框架时会在某个类上加个注解@Controller,用于标示这是一个reques原创 2017-06-14 23:25:40 · 4645 阅读 · 0 评论 -
Spring3.1.0实现原理分析(十二).MVC核心类DispatcherServlet初始化过程
大家好,今天我们分析下DispatcherServlet的初始化过程,下面的配置大家一定不陌生吧,只要使用spring mvc框架大多会在web.xml文件中加入这么一段配置,可见这个类是spring mvc的核心类,就是由它负责处理request请求的,在DispatcherServlet的初始化过程中也会创建web容器,结合上篇博客的内容,这里创建的web容器就是子web容器,而它的父web容器就是在ContextLoaderListener中创建的根web容器。原创 2017-06-07 21:45:56 · 554 阅读 · 0 评论 -
Spring3.1.0实现原理分析(十一).MVC从桌面到web应用
大家好,从这篇博客开始我们开始探讨Spring's MVC模块,分析它的功能,解密它的实现原理。分析MVC模块,首先是要讲明白spring在web应用中是如何被加载的,当一个 web应用启动和卸载时,spring都会执行哪些操作呢?spring通往web应用的走廊是org.springframework.web.context.ContextLoaderListener(容器加载监听器),该类原创 2017-06-01 11:10:20 · 835 阅读 · 0 评论 -
Spring3.1.0实现原理分析(十).AOP代理对象执行拦截过程
大家好,上篇博客讲解了代理对象的创建过程《AOP之创建代理对象的过程》,今天主要分析下代理对象执行拦截的过程。无论是jdk代理对象还是cglib代理对象,它们都持有通知列表对象,而通知对象呢其实就是AOP大联盟的方法拦截器对象(MethodInterceptor)。原创 2017-05-26 17:30:08 · 648 阅读 · 0 评论 -
Spring3.1.0实现原理分析(九).AOP创建代理对象的过程
大家好,今天我会用一个例子来讲解Spring创建bean代理对象的过程,为大家揭开Spring AOP的神秘面纱。在看这篇博客前我强烈建议读者先看下这两篇博客《Spring3.1.0实现原理分析(六).实例化》,《Spring3.1.0实现原理分析(七).填充Bean属性,初始化Bean,登记善后处理,注册单例Bean》, 这两篇博客分析了Spring创建对象的完整过程,有助于你能更好地理解本原创 2017-05-18 10:49:48 · 3614 阅读 · 0 评论 -
Spring3.1.0实现原理分析(八).获取bean对象
Spring获取bean对象的逻辑相对简单,原本不打算专门写篇博客来介绍了。不过想了想,既然上两篇博客分析了Spring创建对象的过程,有创建便有获取,所以还是分析下获取bean对象的过程吧。一. 获取单例bean1). 进入DefaultSingletonBeanRegistry的getSingleton方法,下面是代码片段,简单分析下。protected Object getSingl原创 2017-05-11 12:19:49 · 932 阅读 · 1 评论 -
Spring3.1.0实现原理分析(七).填充Bean属性,初始化Bean,登记善后处理,注册单例Bean
大家好,上篇博客我较详细分析了实例化过程,今天继续探讨实例化之后的其它步骤,分别是“填充Bean属性”,“初始化Bean”,“登记善后处理”,“注册单例Bean”,加之实例化,这五个步骤是Spring创建对象的一个完整过程。一. 填充Bean属性 在已获取到对象实例的基础上,这个阶段的任务就是为Bean的属性赋值,比如上图的定义,需要为zoo对原创 2017-05-08 11:10:50 · 759 阅读 · 0 评论 -
Spring3.1.0实现原理分析(六).实例化
大家好,我在上篇博客中《关于循环引用的探讨》中,有提及Spring创建一个对象大致可以分为五个步骤,分别是“实例化”,“填充属性值”,“初始化”,“登记善后处理”,“注册单例Bean”(上述步骤暂时不考虑AOP)。PS:在Spring中创建对象和实例化对象是两个概念,实例化仅仅是创建对象过程中的一个步骤。 今天就详细分析下实例化的过程,在实例化bean阶段,已知的信息有哪些呢? 主要是原创 2017-05-04 22:48:41 · 722 阅读 · 0 评论 -
Spring3.1.0实现原理分析(五).关于循环引用的探讨
所谓循环引用是指对象之间的互相依赖形成了一个闭环,比如A依赖B,B依赖C,而C又反过来依赖A,这个是关于循环引用的基本认知。然后在Spring中循环引用又可细分成三种场景,我们逐一来分析下。一. 单例bean基于构造函数的循环引用 1). bean定义原创 2017-04-28 13:23:35 · 1252 阅读 · 0 评论 -
Spring3.1.0实现原理分析(四).属性访问器(PropertyAccessor)
属性访问器(PropertyAccessor)和我上一篇博客《Spring3.1.0实现原理分析(三).配置数据》中提到的属性解析器(PropertyResolver)从字面上看很相像,但是两个接口的作用是截然不同的。属性解析器接口是用来获取配置数据的,具体可以看上篇博客,而属性访问器接口的作用是存取Bean对象的属性,所有Spring创建的Bean对象,都使用该接口存取Bean属性值,可见该接口原创 2017-04-24 16:34:22 · 6771 阅读 · 1 评论 -
Spring3.1.0实现原理分析(三).配置数据
今天我想谈一下,Spring从哪里获取配置数据? 配置数据做什么用处? 如何存储和访问配置数据?就像一辆汽车,开之前总得先加油吧,不然何如工作呢。1. 配置数据有哪些,何时加载,其作用是什么。 我觉得Spring的数据源至少可分为两类,JDK系统数据和用户配置数据。jdk系统数据具体是指System#getProperties()方法返回值和System#getenv()方法返回值。用户配置数据其一是使用<context:property-placeholder location="..原创 2017-04-08 11:47:04 · 849 阅读 · 0 评论 -
Spring3.1.0实现原理分析(二).国际化(i18n)
今天和大家一起分析下Spring国际化模块的结构。什么是国际化呢? 我想引用李刚老师曾说过的一句话:“所谓国际化其实就是字符串的查找和替换过程”。查找就是根据code去资源文件中获取value,替换就是把value中可能包含的占位符替换成实际值,所以国际化的关键在于资源文件的加载和消息的渲染。 照例先上一张图,下图是Spring国际化模块主要接口(类)的结构图。----原创 2017-04-08 11:46:28 · 2437 阅读 · 0 评论 -
Spring3.1.0实现原理分析(一).类型转换
类型转换可以说是一个框架的基础性功能, struts2,mybatis等开源软件都有自己的类型转换模块,之所以将类型转换作为Spring源码架构分析系列博客的第一篇,是因为我觉得这个模块在Spring众多模块中是处于最底层的,它只被其它模块引用,而不存在对其它模块的依赖, 柿子找软的捏,我们就拿它祭旗吧~~, 先上一张鸟瞰图,总体结构是不是很简单,TypeConverter是对外提供服原创 2017-04-08 11:45:23 · 1940 阅读 · 0 评论