做自己没做过的事情叫做成长
做自己不愿做的事情叫做改变
做自己不敢做的事情叫做突破
共勉

引言

本人在学习ssm中,已经能熟练的编写配置文件与代码了.但于前几天朋友问其原理与工作流程时却只能答出一二,于是恶补理论知识,写下此篇博客.如有错误还请指出.

Mybatis

工作原理解析

mybatis通过sqlSessionFactoryBuilder从mybatis-config.xml配置文件(如上图第一步)中构建出sqlSessionFactory(线程安全);然后调用sqlSessionFactory的openSession()方法直接开启一个sqlSession,在通过sqlSession实例获得Mapper.xml对象并运行Mapper.xml映射的sql语句,完成对数据库的CRUD和事务提交,每完成一次操作之后sqlSession都需要关闭.

详细流程如下

  1. 加载mybatis全局配置文件,并解析配置文件. mybatis基于配置文件生成Configuration,和一个个MappedStatement(映射语句, 包括了表字段与javaBean属性映射, 动态sql语句, 结果映射集).
  2. SqlSessionFactoryBuilder通过Configuration对象生成SqlSessionFactory,来开启SqlSession会话.
  3. SqlSession对象完成和数据库的交互.
    3.1 用户程序调用mybatis接口层中的方法
    3.2 SqlSession通过调用的方法名找到对应的MappedStatement(映射语句)对象
    3.3 通过Executor(负责动态SQL的生成和查询缓存的维护)将MappedStatement(映射语句)对象进行解析,sql参数转化、动态sql拼接,生成jdbc Statement对象
    3.4 jdbc执行sql
    3.5 借助MappedStatement(映射语句)的结果映射关系,将返回结果转化成所定义的存储类型

jdbc-url增加参数: &rewriteBatchedStatements=true 优化批量新增

springMVC

流程图![百度所找,如有侵权还请联系我]

SpringMVC流程
  1. 用户发送请求至前端控制器DispatcherSerlet.
  2. DispatcherServilet收到请求调用HandlerMapping处理器映射器.
  3. 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找), 生产处理器对象及拦截器(如果有则生成)一并返回给DisparcherServlet.
  4. DispatcherServlet调用HandlerAdapeter处理器适配器.
  5. HandlerAdapter结果适配调用具体的处理器(Controller, 也叫后端控制器, 是通过请求查询路径的)
  6. Controller执行完成返回Model
  7. HandlerAdapter将Controller执行结果通过Model返回给DispatcherServlet
  8. DispatcherServlet将Model传给ViewReslover试图解析器
  9. ViewReslover解析后返回具体View
  10. DispatcherServlet根据View进行渲染视图(即将模型数据填充置视图中).
  11. DispatcherServlet响应视图给用户
组件说明:

以下组件通常使用框架提供实现:

DispatcherServlet(服务调度员):作为前端控制器,整个流程控制的中心,控制其它组件执行, 统一调度, 降低组件之间的耦合性, 提高每个组件的扩展性

HandlerMapping(处理器映射器):通过扩展处理器映射器实现不同的映射方式, 例如: 配置文件, 实现接口方式, 注解方式等

HandlAdapter(处理器适配器):通过扩展处理器适配器, 支持更多类型的处理器.

ViewResolver(视图解析器):通过扩展视图解析器, 支持更多类型的视图解析, 例如: jsp, freemarker, pdf, excel等

组件:

1、前端控制器DispatcherServlet(不需要工程师开发),由框架提供
作用: 接受请求, 响应结果, 相当于转发器, 中央处理器. 有了DispatcherServlet减少了其它组件的耦合度.
用户请求到达前端控制器, 他就相当于MVC模式中的C, DispatcherServlet是整个流程控制的中心, 由他调用其它组件处理用户的请求, DispatcherServlet的存在降低了组件之间的耦合性.

2、处理器映射器HandlerMapping(不需要工程师开发),由框架提供
作用: 根据请求的url查找Handler
HandlerMapping负责根据用户请求找到Handler即处理器, springMVC提供了不同的映射器实现不同的映射方式, 例如: 配置文件, 实现接口方式, 注解方式等

3、处理器适配器HandlerAdapter
作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。

4、处理器Handler(需要工程师开发)
注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler
Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
由于Handler涉及到具体的用户业务请求,所以一般情况需要工程师根据业务需求开发Handler。

5、视图解析器View resolver(不需要工程师开发),由框架提供
作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)
View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。 springmvc框架提供了很多的View视图类型,包括:jstlView、freemarkerView、pdfView等。
一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由工程师根据业务需求开发具体的页面。

6、视图View(需要工程师开发jsp…)
View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf…)

核心架构的具体流程步骤如下:

1、首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;
2、DispatcherServlet——>HandlerMapping, HandlerMapping 将会把请求映射为HandlerExecutionChain 对象(包含一个Handler 处理器(页面控制器)对象、多个HandlerInterceptor 拦截器)对象,通过这种策略模式,很容易添加新的映射策略;
3、DispatcherServlet——>HandlerAdapter,HandlerAdapter 将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;
4、HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter 将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView 对象(包含模型数据、逻辑视图名);
5、ModelAndView的逻辑视图名——> ViewResolver, ViewResolver 将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;
6、View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,因此很容易支持其他视图技术;
7、返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。

下边两个组件通常情况下需要开发:

Handler:处理器,即后端控制器用controller表示。

View:视图,即展示给用户的界面,视图中通常需要标签语言展示模型数据。

springMVC工作流程出处 https://www.cnblogs.com/xiaoxi/p/6164383.html

spring

1. 什么是spring

Spring是一个轻量级集的java开源开发框架

2. spring优点

  • 方便解耦, 简化开发, 也就是 高内聚低耦合
    Spring就是一个大工程(IOC容器), 可以将所有对象创建和依赖关系维护
    Spring工厂用于生成bean
  • AOP, 切面编程的支持
    Spring提供面向切面编程, 可以方便的实现对程序进行权限拦截, 运行监控, 日志操作等功能
  • 声明式事物的支持
    只需要通过配置就可以完成对事物的管理, 无需手动编程
  • 方便集成各种好的框架
    Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持
  • 降低JavaEE API的使用难度
    spring对JavaEE开发中非常难用的API(JDBC, JavaMail, 远程调用等), 提供了封装, 是这些API使用难度大大降低

IOC是什么

Ioc—Inversion of Control,即“控制反转”. 是spring中一个非常非常重要的概念, 它不是什么技术, 而是一种解耦的设计思想. 它的主要目的就是借助于"第三方"(spring中的IOC容器)实现具有依赖关系的对象之间的解耦(IOC容易管理对象, 你只管使用即可), 从而降低代码之间的耦合度. IOC是一个原则, 而不是一个模式, DI(Dependency Injection,即“依赖注入”)是实现控制反转的一种设计模式, 依赖注入就是将实例变量传入到一个对象中去.

  • 谁控制谁,控制什么: 我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。
  • 为何是反转,哪些方面反转了: 有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。
  • 举个例子: 对象a依赖了对象b, 当对象a需要使用对象b的时候必须自己去创建. 但是当系统引入了IOC容器后, 对象a和对象b之间就失去了直接的联系. 这个时候, 当对象a需要使用对象b的时候, 我们可以指定IOC容器去创建一个对象b注入到对象a中. 对象a获得依赖对象b的过程, 有主动行为变为了被动行为, 控制权反转, 这就是控制反转的名字由来.

ioc有什么作用

其实IoC对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC容器来创建并注入它所需要的资源了。

IoC很好的体现了面向对象设计法则之一—— 好莱坞法则:“别找我们,我们找你”;即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。

IoC和DI

DI—Dependency Injection,即“依赖注入”:是组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

理解DI的关键是:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”,那我们来深入分析一下:

●谁依赖于谁:当然是应用程序依赖于IoC容器;

●为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源;

●谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;

●注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。

IoC和DI由什么关系呢?其实它们是同一个概念的不同角度描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年大师级人物Martin Fowler又给出了一个新的名字:“依赖注入”,相对IoC 而言,“依赖注入”明确描述了“被注入对象依赖IoC容器配置依赖对象”。

什么是AOP

AOP(Aspect-OrientedProgramming,面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理, 日志管理, 权限控制等)封装起来, 便于减少系统的重复代码, 降低模块间的耦合度, 并有利于未来的可扩展性和可维护性

使用“横切”技术,AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理就是核心关注点,那些关系不大的就是横切关注点.而横切关注点有一个特点就是他们经常存在于核心关注点,而且各处都基本相似.如:权限认证、日志、事务处理,关闭流操作等.AOP就是将核心关注点和横切关注点分离,并能重用,降低模块间的耦合度.

AOP使用场景

AOP用来封装横切关注点,具体可以在下面的场景中使用:
Authentication 权限
Caching 缓存
Context passing 内容传递
Error handling 错误处理
Lazy loading 懒加载
Debugging  调试
logging, tracing, profiling and monitoring 记录跟踪 优化 校准
Performance optimization 性能优化
Persistence  持久化
Resource pooling 资源池
Synchronization 同步
Transactions 事务

AOP相关概念

方面(Aspect)一个关注点的模块化,这个关注点实现可能另外横切多个对象。事务管理是J2EE应用中一个很好的横切关注点例子。方面用Spring的 Advisor或拦截器实现。

连接点(Joinpoint): 程序执行过程中明确的点,如方法的调用或特定的异常被抛出。

通知(Advice): 在特定的连接点,AOP框架执行的动作。各种类型的通知包括“around”、“before”和“throws”通知。通知类型将在下面讨论。许多AOP框架包括Spring都是以拦截器做通知模型,维护一个“围绕”连接点的拦截器链。Spring中定义了四个advice: BeforeAdvice, AfterAdvice, ThrowAdvice和DynamicIntroductionAdvice

切入点(Pointcut): 指定一个通知将被引发的一系列连接点的集合。AOP框架必须允许开发者指定切入点:例如,使用正则表达式。 Spring定义了Pointcut接口,用来组合MethodMatcher和ClassFilter,可以通过名字很清楚的理解, MethodMatcher是用来检查目标类的方法是否可以被应用此通知,而ClassFilter是用来检查Pointcut是否应该应用到目标类上

引入(Introduction): 添加方法或字段到被通知的类。 Spring允许引入新的接口到任何被通知的对象。例如,你可以使用一个引入使任何对象实现 IsModified接口,来简化缓存。Spring中要使用Introduction, 可有通过DelegatingIntroductionInterceptor来实现通知,通过DefaultIntroductionAdvisor来配置Advice和代理类要实现的接口

目标对象(Target Object): 包含连接点的对象。也被称作被通知或被代理对象。POJO

AOP代理(AOP Proxy): AOP框架创建的对象,包含通知。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。

织入(Weaving): 组装方面来创建一个被通知对象。这可以在编译时完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。

五种增强

前置增强:是前置增强顶层接口,因为Spring只支持方法的增强,其子接口MethodBeforeAdvice是目前可用的前置增强。表示在目标方法执行前实施增强。

后置增强:是目前可用的后置增强,表示在目标方法执行后实施增强。

环绕增强:包围一个连接点的通知,如方法调用。这是最强大的一种通知类型。环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它自己的返回值或抛出异常来结束执行。

异常抛出增强:代表了异常抛出增强,表示在目标方法抛出异常后实施增强。

引介增强:引介增强是一种比较特殊的增强类型,它不是在目标方法周围织入增强,而是为目标类创建新的方法和属性,所以引介增强的连接点是类级别的,而非方法级别的。通过引介增强,我们可以为目标类添加一个接口的实现,即原来目标类未实现某个接口,通过引介增强可以为目标类创建实现该接口的代理。

后记:

这三个框架的理论还是面试经常问的,而且不管是面试,还是要去撸源码,了解他们的工作流程是必不可少的,为了成为架构师,加油.

mybatis+springMVC+spring原理及工作流程相关推荐

  1. MyBatis(五)MyBatis整合Spring原理分析

    前面梳理了下MyBatis在单独使用时的工作流程和关键源码,现在看看MyBatis在和Spring整合的时候是怎么工作的 也先从使用开始 Spring整合MyBatis 1.引入依赖,除了MyBati ...

  2. MyBatis整合Spring原理分析

    目录 MyBatis整合Spring原理分析 MapperScan的秘密 简单总结 假如不结合Spring框架,我们使用MyBatis时的一个典型使用方式如下: public class UserDa ...

  3. k8s创建pod加入容器_K8S架构原理及其工作流程

    K8S 容器编排系统 容器编排系统需要满足的条件: 服务注册,服务发现 负载均衡 配置.存储管理 健康检查 自动扩缩容 零宕机 K8S整体架构图 K8S整体架构 Kubernetes采用主从分布式架构 ...

  4. redux的原理、工作流程及其应用

    redux的原理.工作流程及其使用 Redux对于JavaScript应用而言是一个可预测状态的容器.换言之,它是一个应用数据流框架,而不是传统的像underscore.js或者AngularJs那样 ...

  5. ceph原理及工作流程浅析

    ceph工作原理及工作流程浅析 其命名和UCSC(Ceph诞生地)的吉祥物有关,这个吉祥物是"Sammy",一个香蕉色的蛞蝓,就是头足类中无壳的软体动物.这些有多触角的头足类动物, ...

  6. 【SEO学习】第一步:了解搜索引擎基本工作原理和工作流程

    我们常用的搜索引擎一般都是百度.谷歌.搜狗.360.bing这五种,对于搜索引擎的原理和工作流程应该是一样的.今天郑州SEO老冯先给大家说一下百度搜索引擎的工作原理以及抓取过程.这是SEO学习的第一步 ...

  7. mybatis 原理_Mybatis工作流程及其原理与解析

    Mybatis简介: MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis ...

  8. SpringMVC的简介和工作流程

    一.简介 Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块.Spri ...

  9. Struts2的工作原理及工作流程

    众所周知,Struts2是个非常优秀的开源框架,我们能用Struts2框架进行开发,同时能 快速搭建好一个Struts2框架,但我们是否能把Struts2框架的工作原理用语言表达清楚,你表达的原理不需 ...

最新文章

  1. 二十、异步调用的问题
  2. [Java Web – Maven – 1A]maven 3.3.3 for windows 配置(转)
  3. 前端后端接口那些事吐槽
  4. 【软件分析与挖掘】An Empirical Study of Bugs in Build Process
  5. python视频教程唐学韬-python
  6. highchart图表drilldown钻取功能及event点击事件添加(1)
  7. pic pwm 占空比可调 源码_PWM占空比 调节实例
  8. 鸿蒙HarmonyOS,真的来了!
  9. c语言如何画函数图形,c语言绘制函数曲线
  10. 阿里巴巴矢量字体库更改设置
  11. python获取上周周一日期_python python日期算法 本周,上周,本月,上月,本季,上季,今年, 去年...
  12. SICP练习1.16
  13. 根据离散傅里叶变换对ECG信号进行频谱分析
  14. 扬帆际海—shopee跨境店和本土店谁更有优势?
  15. C#使用Microsoft.office.interop.PowerPoint生成PPT
  16. 代表着团结幸福平安的中国结绳
  17. tp5 验证码输入错误后自动刷新
  18. ES修改mapping中的字段名称
  19. arduino温度控制器_适用于FPS的最佳控制器-使用Arduino和OrbShield与Windows 7配合使用的SpaceTec SpaceOrb 360控制器...
  20. Linux里利用grep和find查找文件内容

热门文章

  1. C语言中的bool类型
  2. 编码技术-RZ、NRZ、NRZI、曼彻斯特、差分曼彻斯特等
  3. 贪吃蛇c语言ege程序流程图,C语言 -- EGE 贪吃蛇简单制作及ege库安装
  4. Objective-C++之WCDB学习
  5. hc-05蓝牙模块使用问题
  6. Debian11搭建魔兽世界WLK3.3.5私人服务器(愿圣光忽悠着你)
  7. autojs之彩色按钮
  8. LeetCode刷题专栏第一篇--思维导图时间安排
  9. 零基础搭建双端影视盒子——三、生成双端影视
  10. VMware Workstation 7.0 虚拟机安装雪豹snow leopard 10.6