SpringMVC—概述

 

 

mvc容器的实例化:

http://blog.csdn.net/lin_shi_cheng/article/details/50686876

 

Spring的启动过程:

 

1:

对于一个web应用,其部署在web容器中,web容器提供其一个全局的上下文环境,这个上下文就是ServletContext,其为后面的spring IoC容器提供宿主环境;

 

2:

在web.xml中会提供有contextLoaderListener。在web容器启动时,会触发容器初始化事件,此时contextLoaderListener会监听到这个事件,其contextInitialized方法会被调用,在这个方法中,spring会初始化一个启动上下文,这个上下文被称为根上下文,即WebApplicationContext,这是一个接口类,确切的说,其实际的实现类是XmlWebApplicationContext。这个就是spring的IoC容器,其对应的Bean定义的配置由web.xml中的context-param标签指定。在这个IoC容器初始化完毕后,spring以WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE为属性Key,将其存储到ServletContext中,也就是web容器。web容器也是map集合的方式管理spring的容器的。便于获取; 

 

3:

contextLoaderListener监听器初始化完毕后,开始初始化web.xml中配置的Servlet,这个servlet可以配置多个,以最常见的DispatcherServlet为例

 

首先web.xml中定义了servlet,load-on-startup=1: 启动优先级。

 

HttpServletBean类有一个入口点就是重写了init方法,init()都做了什么事呢?

 1)PropertyValues类:获取Web.xml里面的servlet的init-param(web.xml)

2)ResourceLoader接口:根据资源地址读取.xml配置信息加载资源,指定bean配置文件的来源。

 3)BeanWrapper接口:对xml配置标签进行解析将系统默认的bean种属性设置到对应的bean属性。

4)调用initServletBean():为子类提供模版让子类根据自己需求实现不同ServletBean的初始化工作

 

总结: 

SpringMVC用三个不同类层次以抽象和继承来实现不用的功能,分工合作,实现了解耦的设计原则。

 

HttpServletBean

实现了获取web.xml中的<init-param>配置元素的值;

FrameworkServlet

实现SpringMVC上下文并根据不同的DispatcherServlet放在以servlet-namekeysevertContext中;

DispatcherServlet

初始化处理器映射、视图解析等,实现初始化SpringMVC组件元素。

 

自动扫描cn.smbms.controller包下的javaBean,使添加了标注的处理器Bean组件生效,此时的javaBean不再需要继承AbstractController,

<context:component-scan base-package="com.del.service,com.del.controller"/>

作用:自动批量注册处理器映射,小写驼峰命名,注册完成之后,再通过DefaultAnnotationHandlerMappingAnnotationMethodHandlerAdapter这两个Bean的实例完成对注解的支持.@Controller表示处理器,用@RequestMapping()表示请求映射.

--------------------重点-----------------------------

DefaultAnnotationHandlerMapping:作用:

用来解析Spring MVC里面的annotation对应的Controller,也就是通过这个类,给annotation设置映射关系,如@RequestMapping等

AnnotationMethodHandlerAdapter:作用:

对Annotation设置的方法进行处理,再返回给!

 

还会自动注册FormarttingConversionServiceFactoryBean(此实例为spring类型转换核心接口ConversionService的默认注册实例)来通过格式化注解,解决日期的格式转换问题

<mvc:annotation-driven/>

   

===================补充=============================

配置处理器映射所用的接口HandlerMapping:

1:第一个是实现类Spring默认的处理器映射,意思是查找与请求URL同名的处理器Bean,这个映射器是不需要配置就可以生效的:

2:第二个实现类是通过注解的方式来进行URL和处理器Bean组件的映射

   

SpringMVC是如何配置处理器映射的呢?

   

1:默认用BeanNameUrlHandlerMapping配置处理器映射,表示:(如果请求的路劲是"/index.html",则分配到后面class所指定的处理器去处理)

<bean name="/index.html" class="cn.smbms.controller.IndexController"/>

   

2:A:创建一个控制器:同过继承AbstractController,重写handlerRequestInternal方法,将IndexController这样的javaBean变成一个能处理前端请求的控制器

   

B: 配置视图层的Bean组件

   

   

当我们需要controller返回一个mapjson对象时,可以设定<mvc:annotation-driven />

同时设定<mvc:message-converters> 标签,设定字符集和json处理类,如下代码:

 

 

springMVC-web.xml的启动:

1:加载Spring配置文件

   

<context-param>

     <param-name>contextConfigLocation</param-name>

     <param-value>classpath:applicationContext-mybatis.xml</param-value>

 </context-param>

 

2:容器启动监听器,去初始化容器

web容器的入口是被WEB容器所控制的,所以无法在main方法中同过调用创建classpath.xml application context对象来启动spring 容器。所以spring容器提供了一个监听类叫做contextLoaderListen,这个监听实现了servletListener接口,可以在外部容器启动的时候去初始容器,当然,前提是我们必须在web.xml文件中先配置此监听,配置如下:

   

<listener>   

<listener-class>

org.springframework.web.context.ContextLoaderListener

</listener-class>

</listener>

原文地址:https://www.cnblogs.com/domi22/p/8047942.html