Java_问题(11——15)


11.Ioc控制反转

在采用面向对象方法设计的软件系统中,底层实现都是由N个对象组成的,所有对象通过彼此的合作,最终实现系统的业务逻辑。即软件系统中对象之间的耦合,这样的话,对象与对象之间有着复杂的联系。为了解耦,所以出现了IOC。


IoC 这个概念。简单来说就是把复杂系统分解成相互合作的对象,这些对象类通过封装以后,内部实现对外部是透明的,从而降低了解决问题的复杂度,而且可以灵活地被重用和扩展。IoC理论提出的观点大体是这样的:借助于“第三方”实现具有依赖关系的对象之间的解耦,如下图所示:

happysneaker.com

即把各个对象类封装之后,通过IoC容器来关联这些对象类。这样对象与对象之间就通过IoC容器进行联系,但对象与对象之间并没有什么直接联系。

happysneaker.com

happysneaker.com

IOC(控制反转)的别名:依赖注入(DI)

所谓依赖注入,就是由IoC容器在运行期间,动态地将某种依赖关系注入到对象之中。

IOC的原理

控制反转是Spring框架的核心,其原理是基于面向对象OO设计原则的The Hollywood Principle:Don't call  us, we will call you.(别找我,我会来找你)。也就是说,所有的组建都是被动的,所有的组件初始化和调用都是由容器负责。组建处在一个容器中,由容器负责管理。简单来讲,就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控,即在一个类中调用另外一个类。这就是控制反转的概念所在:控制权由代码转到了外部容器,控制权的转移,即所谓反转。


另外Spring的两大主要思想的另一个AOP:面向切面编程:

https://www.cnblogs.com/Wolfmanlq/p/6036019.html


12.Spring工作流程

先上工作流程图:

happysneaker.com


★然后是工作流程,分为8步:

1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;

      2. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;

      3. DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法

       4.  提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:

      HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息

      数据转换:对请求消息进行数据转换。如String转换成Integer、Double等

      数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等

      数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中

      5.  Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;

      6.  根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;

      7. ViewResolver 结合Model和View,来渲染视图(modelAndView中包含了视图逻辑名和模型数据信息),DispatcherServlet通过ViewResolver完成逻辑视图名到真实视图对象的解析工作。

      8. 将渲染结果返回给客户端(当得到真实对象的view,DispatcherServlet就使用这个view对象对modelAndView中的模型数据进行视图渲染,然后将渲染后的结果返回给客户端)。


(从宏观角度来讲:DispatcherServlet是整个web应用的控制器。从微观来看,controller是单个HTTP请求的控制器,,而modelAndView是HTTP请求过程中返回的模型和视图。)


13.

happysneaker.com


 Spring为什么要结合使用HandlerMapping以及HandlerAdapter来处理Handler?

    符合面向对象中的单一职责原则,代码架构清晰,便于维护,最重要的是代码可复用性高。如HandlerAdapter可能会被用于处理多种Handler。




14.HandlerMapping

处理器映射。

有什么用呢:通过处理器映射,你可以将web请求映射到正确的处理器handler上(handlermapping返回的就是一个handler)。

在基于springmvc的web应用程序中,我们可以为前端控制器DispatcherServlet提供多个handlermapping供其使用,DispatcherServlet将会选用一个优先级最高的handlermapping,若handlermapping返回的是一个可用的handler,那么DispatcherServlet将使用当前返回的handler进行web请求的处理,而不再询问其他的handlermapping,否则DispatcherServlet 将不断轮询其他的handlermapping,直到获得一个可用的handler。

happysneaker.com


那么什么又是DispatcherServlet呢,是SpringMVC提供的前置控制器,所有的请求都经过他来统一分发,在DispatcherServlet将请求发送给SpringController之前,需要借Handlermapping来定位到具体的Controller。


总之Handlermapping的作用一句话:

根据当前请求找到对应的handler,并将handler(执行程序)与一堆handlerInterceptor(拦截器)封装到HandlerExecutionChain对象中。


15.HandlerAdapter

HanlderAdapter:根据handler来找到支持他的HandlerAdapter,通过HandlerAdapter执行这个handler得到modelAndView对象。

springmvc通过handlerAdapter的handler方法来调用请求处理函数。

在DispatcherServlet根据URL利用handlermapping找到对应的handler之后,首先检查当前的IOC容器中所有的可用的HanderAdapter,再利用HandlerAdapter中的supports方法找到可以使用的HandlerAdapter,handlerAdapter是用来执行之前所得到的handler的,然后执行之后就是向DispatcherServlet返回一个modelAndView对象。




PS.拦截器、过滤器:https://zhidao.baidu.com/question/583953960492530045.html

Unity那些事儿
请先登录后发表评论
  • 最新评论
  • 总共0条评论