spring ioc、spring mvc原理分析

 

Spring框架

 

百度百科

Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EE  full-stack( 一站式)轻量级开源框架。

 

我们为什么需要Spring Framework?

Spring是独特的,它定位的领域是许多其他流行的framework没有的。Spring致力于提供一种方法管理你的业务对象。同时它有可能成为所有企业应用程序的一站式解决方案。

 

可以只选择需要的模块

Spring 是模块化的项目,允许你挑选和选择适用于你的模块,不必要把剩余部分也引入。Spring 框架提供约 20 个模块,可以根据应用程序的要求来使用。比如说你刚建立一个项目的时候,你挑选的spring boot + spring data jpa开发项目,jpa是一个持久层的框架,遇到后面你想要做负载均衡的时候,session共享就可以使用spring session。搭建微服务的时候可以使用spring cloud等等,可以看到些为我们开发的过程中会遇到的一些常见问题,都提供了一套解决方案。

 

概念

Spring是一个轻量级控制反转(IOC)和面向切面(AOP)的容器框架,它主要是为了解决企业应用开发的复杂性而诞生的。目的就是解决企业应用开发的复杂性。

关于它的特点呢?我们可以提几个关键字出来。

  • 轻量级,非侵入性
  • 依赖注入
  • 面向切面编程
  • 容器
  • 框架
  • 一站式

然后通过它的特点,我们就可以总结数它的优点。

  • 低侵入式设计,代码污染极低
  • write once,run everywhere
  • DI有效地降低了耦合
  • AOP提供了通用任务的集中管理。
  • orm和dao简化了对数据库访问。
  • 高度开放性,并不强制

 

spring的各个模块作用

核心容器

核心容器由核心,Bean,上下文和表达式语言模块组成,它们的细节如下:

  • 核心模块提供了框架的基本组成部分,包括 IoC 和依赖注入功能。
  • Bean 模块提供 BeanFactory,它是一个工厂模式的复杂实现。
  • 上下文模块建立在由核心和 Bean 模块提供的坚实基础上,它是访问定义和配置的任何对象的媒介。ApplicationContext 接口是上下文模块的重点。
  • 表达式语言模块在运行时提供了查询和操作一个对象图的强大的表达式语言。

数据访问/集成

数据访问/集成层包括 JDBC,ORM,OXM,JMS 和事务处理模块,它们的细节如下:

  • JDBC 模块提供了删除冗余的 JDBC 相关编码的 JDBC 抽象层。
  • ORM 模块为流行的对象关系映射 API,包括 JPA,JDO,Hibernate 和 iBatis,提供了集成层。
  • Java 消息服务 JMS 模块包含生产和消费的信息的功能。
  • 事务模块为实现特殊接口的类及所有的 POJO 支持编程式和声明式事务管理。

Web

Web 层由 Web,Web-MVC,Web-Socket 和 Web-Portlet 组成,它们的细节如下:

  • Web 模块提供了基本的面向 web 的集成功能,例如多个文件上传的功能和使用 servlet 监听器和面向 web 应用程序的上下文来初始化 IoC 容器。
  • Web-MVC 模块包含 Spring 的模型-视图-控制器(MVC),实现了 web 应用程序。
  • Web-Socket 模块为 WebSocket-based 提供了支持,而且在 web 应用程序中提供了客户端和服务器端之间通信的两种方式。

其他

还有其他一些重要的模块,像 AOP,Aspects,Instrumentation,Web 和测试模块,它们的细节如下:

  • AOP 模块提供了面向方面的编程实现,允许你定义方法拦截器和切入点对代码进行干净地解耦,它实现了应该分离的功能。
  • Aspects 模块提供了与 AspectJ 的集成,这是一个功能强大且成熟的面向切面编程(AOP)框架。

 

spring ioc原理

Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。它能指导我们如何设计出松耦合、更优良的程序。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”

那我们来深入分析一下:

 

●谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,就是说控制对 象的创建;所以说,谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)

 

●为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。

 

所谓IOC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。

综上所述,我们知道控制反转,就是控制权的转移,应用程序本身不负责依赖对象的创建和维护,而是由外部容器负责创建和维护。前面我们说过spring框架解决的是业务逻辑层和其他各层的松耦合问题。那么讲到这里,我们就应该知道,ioc就是各层之间松耦合的关键。所以说,ioc是spring的核心基础模块,贯穿始终spring整个生态框架。没了ioc,后面的模块也就不成立了。

 

spring ioc、spring mvc原理分析

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

 

关键词:控制反转、松耦合、面向接口

 

BeanFactory与ApplicationContext

  • BeanFactory: IOC 容器的基本实现.
  • ApplicationContext: 提供了更多的高级特性. 是 BeanFactory 的子接口.
  • BeanFactory是Spring框架的基础设施,面向Spring本身;ApplicationContext 面向使用 Spring 框架的开发者,几乎所有的应用场合都直接使用 ApplicationContext 而非底层的 BeanFactory
  • 无论使用何种方式, 配置文件时相同的

 

spring ioc demo

官方文档学习(英文):

https://docs.spring.io/spring/docs/5.0.8.RELEASE/spring-framework-reference/core.html#spring-core

 

spring demo步骤:

  • 建立maven项目
  • 添加spirng的依赖
  • 编写接口和实现类
  • 配置文件applicationContext.xml
  • 编写测试类

spring ioc demo简单学习例子:

https://gitee.com/lv-success/git-second/tree/master/course-2-spring/springDemo

 

servlet、jsp、mvc与spring mvc

 

Web端开发发展历程

1、servlet---一种JavaEE web组件技术,是一种在服务器端执行的web组件,用于接收web用户请求并处理,最后动态产生响应给用户。但每次请求只产生一个线程(而且有线程池),轻量级。而且能利用许多JavaEE技术(如JDBC等)。本质就是在java代码里面 输出 html流。但表现逻辑、控制逻辑、业务逻辑调用混杂。

这种做法是绝对不可取的,控制逻辑、表现代码、业务逻辑对象调用混杂在一起,最大的问题是直接在Java代码里面输出Html,这样前端开发人员无法进行页面风格等的设计与修改,即使修改也是很麻烦,因此实际项目这种做法不可取。

2、JSP:(Java Server Page)一种在服务器端执行的web组件,是一种运行在标准的HTML页面中嵌入脚本语言(现在只支持Java)的模板页面技术。本质就是在html代码中嵌入java代码。JSP最终还是会被编译为Servlet,只不过比纯Servlet开发页面更简单、方便。但表现逻辑、控制逻辑、业务逻辑调用还是混杂。

这种做法也是绝对不可取的,控制逻辑、表现代码、业务逻辑对象调用混杂在一起,但比直接在servlet里输出html要好一点,前端开发人员可以进行简单的页面风格等的设计与修改(但如果嵌入的java脚本太多也是很难修改的),因此实际项目这种做法不可取。

JSP+javaBean

使用<jsp:useBean>标准动作,自动将请求参数封装为JavaBean组件;还必须使用java脚本执行控制逻辑。JSP负责控制逻辑、表现逻辑、业务对象(javabean)的调用,只是比纯JSP简化了获取请求参数和封装请求参数。

 

之前的项目比较简单,多是用JSP 、Servlet + JDBC 直接搞定

 

MVC模型:是一种架构型的模式,本身不引入新功能,只是帮助我们将开发的结构组织的更加合理,使展示与模型分离、流程控制逻辑、业务逻辑调用与展示逻辑分离。

 

首先让我们了解下MVC(Model-View-Controller)三元组的概念:

Model(模型):数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或JavaBean组件(包含数据和行为),不过现在一般都分离开来:Value Object(数据) 和 服务层(行为)。也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。

 

View(视图):负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。

 

Controller(控制器):接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展示。 也就是说控制器做了个调度员的工作,。

spring ioc、spring mvc原理分析

 

那我们标准的MVC框架已经讲完。接下来我们讲讲spring mvc,

 

Spring MVC 是一个模型 - 视图 - 控制器(MVC)的Web框架建立在*前端控制器servlet(DispatcherServlet),它负责发送每个请求到合适的处理程序,使用视图来最终返回响应结果的概念。Spring MVC 是 Spring 产品组合的一部分,它享有 Spring IoC容器紧密结合Spring松耦合等特点,因此它有Spring的所有优点。

 

那大家想想标准MVC的概念,应该有3个模块,分别是model,view,controller。 spring mvc也是一个mvc框架。我们现在spring mvc项目中模块很多。什么controller,sevice, dao,javabean呀。到底分别属于MVC的哪个模块呢。

 

view是view,controller是controller,model包括entity,service,dao等

 

spring mvc原理

 

spring mvc处理流程

  1. 用户发送请求至前端控制器DispatcherServlet。
  1. DispatcherServlet收到请求调用HandlerMapping处理器映射器。
  1. 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
  1. DispatcherServlet调用HandlerAdapter处理器适配器。
  1. HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
  1. Controller执行完成返回ModelAndView。
  1. HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
  1. DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
  1. ViewReslover解析后返回具体View。
  1. DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
  1. DispatcherServlet响应用户。

 

spring mvc主要组件

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等。

 

 

spring mvc的好处

√让我们能非常简单的设计出干净的Web层和薄薄的Web层;

√进行更简洁的Web层的开发;

√天生与Spring框架集成(如IoC容器、AOP等);

√提供强大的约定大于配置的契约式编程支持;

√能简单的进行Web层的单元测试;

√支持灵活的URL到页面控制器的映射;

√非常容易与其他视图技术集成,如Velocity、FreeMarker等等,因为模型数据不放在特定的API里,而是放在一个Model里(Map数据结构实现,因此很容易被其他框架使用);

√非常灵活的数据验证、格式化和数据绑定机制,能使用任何对象进行数据绑定,不必实现特定框架的API;

√更加简单的异常处理;

√对静态资源的支持;

√支持Restful风格。

 

spring mvc demo

https://gitee.com/lv-success/git-second/tree/master/course-2-spring/springMvcDemo

 

模仿MVC demo

https://gitee.com/lv-success/git-second/tree/master/course-2-spring/liughMVC