编程体系结构(08):Spring.Mvc.Boot框架

本文源码:GitHub·点这里 || GitEE·点这里

一、Spring框架

1、框架概述

Spring是一个开源框架,框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。Spring是一个分层的轻量级开源框架。

基本特性:分层架构、高内聚低耦合、支持AOP编程、事务管理、集成测试、集成各种框架。

2、核心组件

核心容器:包含Bean的创建、配置、管理等功能。

AOP切面编程:可以帮助应用程序解耦。

数据访问:集成了JDBC,常用的Dao层框架hibernate,mybatis等。

Web编程:集成流程的MVC框架,实现界面逻辑和应用程序分离。

3、Bean对象理解

Spring容器负责创建,装配,设置属性,进而管理整个生命周期的对象,称为Bean对象。

装配方式:XML格式、注解扫描、Java代码装配。

作用域:用于确定spring创建bean实例个数,比如单例Bean,原型Bean。singleton默认单例、prototype多例、request请求、session会话级、global-session。

生命周期:实例化,属性加载,初始化前后管理,销毁。

4、常用核心注解

Controller:标记一个类是Handler,基于@Mapping相关注解(@GetMapping、@PostMapping、@PutMapping、@DeleteMapping),用来关联请求和Controller方法之间的映射关系,这样的Controller 就可以被请求访问。

RequestMapping:处理请求地址映射的注解,可作用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以类上标注地址作为父路径。

Resource:按照ByName自动注入,需要导入包javax.annotation.Resource。@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。

Service:可以取代具体配置文件的Bean管理,定义的bean默认是单例的,默认名称是类名且首字母小写。

5、IOC与DI思想

IOC容器

Java系统中对象耦合关系十分复杂,系统的各模块之间依赖,微服务模块之间的相互调用请求,都是这个道理。降低系统模块之间、对象之间、微服务的服务之间耦合度,是软件工程核心问题之一。因为Spring框架中核心思想就是IOC控制反转,用来实现对象之间的解耦。

依赖注入

IOC给对象直接建立关系的动作,称为DI依赖注入(Dependency Injection);依赖:对象A需要使用对象B的功能,则称对象A依赖对象B。注入:在对象A中实例化对象B,从而使用对象B的功能,该动作称为注入。

6、Aop切面编程

通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。核心作用:可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的复用性和开发效率。AOP提供了取代继承和委托的一种新的方案,而且使用起来更加简洁清晰,是软件开发中的一个热点理念。

实现方式:JDK动态代理、CgLib字节码增强、Spring半自动代理、Spring全自动代理。

7、事务管理

事务是指作为单个逻辑工作单元执行的一系列操作(SQL语句)。这些操作要么全部成功,要么全部不成功。Spring事务管理的本质就是封装了数据库对事务支持的操作,使用JDBC的事务管理机制,就是利用java.sql.Connection对象完成对事务的提交和回滚。

核心API封装

PlatformTransactionManager:平台事务管理器,Spring管理事务,必须使用事务管理器进行事务配置时,核心方法:获取事务,提交事务,回滚事务。

TransactionDefinition:该对象封装事务详情(事务定义、事务属性),例如:隔离级别、是否只读、超时时间 等。

TransactionStatus:用于记录当前事务运行状态。例如:是否有保存点,事务是否完成。Spring底层根据状态进行相应操作。

8、配置文件

在Spring的配置文件中,通常会配置下列核心内容;

  • 读取外部配置文件,例如JDBC参数;
  • 配置数据库连接池,例如Druid、C3P0等;
  • 整合环境配置,例如SSM或者SSH集成;
  • 管理Transaction事务的控制方式;
  • 整合常用组件,例如邮件、任务、MQ等;

在实际开发中,复杂的项目配置十分繁杂且不好管理,可能项目中涉及不同环境的配置文件都有几十个,所在在SpringBoot框架中采用统一约定的方式简化。

9、环境整合SSM、SSH

Spring框架聚合很强的整合能力,例如常见的整合Mybatis,Mvc,Hibernate,Redis等系列组件,为开发环境的集成提供很大的便利,整体职责上分为几层:控制层、业务逻辑层、数据持久层、域模块层、中间件层,以帮助开发人员在短期内搭建结构清晰、可复用性好、维护方便的Web应用程序。

10、设计模式

单例模式:Spring框架中Bean对象的管理,默认单例,也可以显式标识为多例模式。

工厂模式:通过对应的工厂来生成类的对象,这种设计方式符合“开闭”原则。Spring框架中BeanFactory和Bean的用法。

适配器模式:SpringMvc执行控制中,前段控制器DispatcherServlet调用处理器适配器去执行Handler,处理器适配器去执行Handler,给适配器返回ModelAndView。

责任链模式:DispatcherServlet核心方法doDispatch。HandlerExecutionChain只是维护HandlerInterceptor的集合,可以向其中注册相应的拦截器,本身不直接处理请求,将请求分配给责任链上注册处理器执行,降低职责链本身与处理逻辑之间的耦合程度。

二、SpringMvc模式

1、Mvc模式理念

SpringMVC是一种基于Java实现的MVC设计模式的请求驱动类型的轻量级Web框架,出自Spring框架全家桶,与Spring框架无缝整合,使用了MVC架构模式的思想,将Web层进行职责解耦。结构松散,几乎可以在SpringMVC中使用各类视图,各个模块分离而且耦合度非常低,且易于扩展。与Spring无缝集成,且简单,灵活,容易上手。

2、执行流程

发起请求到前端控制器DispatcherServlet;前端控制器请求HandlerMapping查找,Handler可以根据xml配置、注解进行查找;

处理器映射器HandlerMapping向前端控制器返回Handler;前端控制器调用处理器适配器去执行Handler;处理器适配器去执行Handler;

Handler执行完成给适配器返回ModelAndView;处理器适配器向前端控制器返回ModelAndView,ModelAndView是springmvc框架的一个底层对象,包括Model和view;

前端控制器请求视图解析器去进行视图解析,根据逻辑视图名解析成真正的视图;视图解析器向前端控制器返回View;前端控制器进行视图渲染,视图渲染将模型数据(在ModelAndView对象中)填充到request域中;前端控制器向用户响应结果;

3、核心组件

前端控制器:请求离开浏览器后,最先到达的就是DispatcherServlet,是整个流程控制的中心。

处理器映射器:根据请求的url路由到指定接口,用户请求找到Handler处理器。

处理器适配器:按照特定规则去执行Handler,支持多种处理器,各种处理器中的处理方法各不相同。

处理器:处理用户请求,涉及具体业务逻辑,需要根据业务需求开发。

视图解析器:将请求的响应结果生成View,根据逻辑视图名解析成物理视图名,就是具体页面地址。

视图:Mvc框架提供很多的View视图类型的支持,包括:jsp、freemarker、pdf等。

4、参数处理

requestParam:主要用于在SpringMvc框架的控制层获取参数,三个常用参数:defaultValue表示设置默认值,required 通过boolean设置是否是必须要传入的参数,value值表示传入的参数名称。

RequestBody:接收请求体中传递给后端的Json字符串数据的,GET方式无请求体,所以使用@RequestBody接收数据时,不能使用GET方式提交数据,需要用POST方式进行提交。

ResponseBody:该注解用于方法的返回对象,可以通过配置转换器为指定数据响应格式,如果希望返回的数据不是View试图页面,而是指定数据格式的时候使用,例如:Json、Xml等。

5、整合Spring框架

  • 配置扫描接口文件;
  • 启动MVC默认的注解映射的方式;
  • 配置视图解析器;
  • Web.xml配置加载Spring-Mvc文件;

6、对比WebFlux

响应式编程是一种基于数据流和变化传递的声明式的编程范式,WebFlux是Web控制端响应式编程中的组成部分,在Spring官网上有说明,不是为了替代SpringMvc,是用来提供更多场景的解决方案。

三、SpringBoot框架

1、常用基础功能

  • 环境搭建和注解启动机制,日志打印;
  • 全局异常处理,定时任务异步任务使用;
  • 拦截器配置,置AOP切面编程,文件管理;
  • 整合JWT、Shiro、Security等常用安全组件;
  • 集成Actuator监控组件,系统打包运行;

2、整合数据源

  • 整合JdbcTemplate,JPA,多数据源配置;
  • 集成Druid、C3P0常用连接池;
  • 整合Mybatis框架,集成分页管理;

3、集成常用中间件

  • 集成Redis缓存,Cache注解模式;
  • 集成ElasticSearch框架,实现高性能搜索引擎
  • 基于Swagger2 ,构建接口管理界面;

整个SpringBoot框架是基于Spring框架之上多个很多约定的规范,底层原理并没有改变,更多是熟悉各种用法,用多就会明白。

四、对比分析

Spring框架相对Spring开源生态是最底层的实现原理,SpringMvc是基于之上而来的,主要简化Web控制层的开发,例如之前的Struts、Servlet都逐渐被替换。

SpringBoot则在Spring+Mvc基础上,实现很强大的约定配置,对复杂的环境做了约定的集成,简化开发配置,业务性开发还是一样的,在SSM环境下不管项目配置启动调试都十分的复杂,到SpringBoot层面之后被不断简化,所以SpringBoot学习在理解约定的配置规范后,基本很容易上手。

五、源代码地址

GitHub·地址
//github.com/cicadasmile
GitEE·地址
//gitee.com/cicadasmile

推荐阅读:编程体系整理

序号 项目名称 GitHub地址 GitEE地址 推荐指数
01 Java描述设计模式,算法,数据结构 GitHub·点这里 GitEE·点这里 ☆☆☆☆☆
02 Java基础、并发、面向对象、Web开发 GitHub·点这里 GitEE·点这里 ☆☆☆☆
03 SpringCloud微服务基础组件案例详解 GitHub·点这里 GitEE·点这里 ☆☆☆
04 SpringCloud微服务架构实战综合案例 GitHub·点这里 GitEE·点这里 ☆☆☆☆☆
05 SpringBoot框架基础应用入门到进阶 GitHub·点这里 GitEE·点这里 ☆☆☆☆
06 SpringBoot框架整合开发常用中间件 GitHub·点这里 GitEE·点这里 ☆☆☆☆☆
07 数据管理、分布式、架构设计基础案例 GitHub·点这里 GitEE·点这里 ☆☆☆☆☆
08 大数据系列、存储、组件、计算等框架 GitHub·点这里 GitEE·点这里 ☆☆☆☆☆