springMVC源码深度解析-初始化(适合初学者)

1. 什么是MVC

mvc是一种设计模式,帮助使用者更好搭建和编写项目,在b/s,c/s架构中经常使用,mvc表示全称为Model-View-controller,即模型-视图-控制三层结构,三层每层负责不同的功能,其中,model层用于封装简单的javaBean和复杂的javaBean,包括业务层,甚至dao层,只要是个javabean都属于model(注意不要狭义的以为,java仅仅只是pojo对象,他也可以是一个包含复杂逻辑的service),pojo对象的代码都是包含的,视图层主要是页面,用于返回给用户的,直观的一种可视化的界面,比如jsp,html

2.什么是springMVC

SpringMVC是整个spring中的一个很小的组成,准确的说他是spring WEB这个模块的下一个子模块,springMVC本质上是一个servlet,因为他间接的继承了httpServlet至于什么是servlet,本文就不做过多的解释了,可以参照我之前的博客链接如下:servlet教程

3.DispatcherServlet的继承关系图

DispatcherServlet的继承关系图,能清晰的了解整个层次。

4.DispatcherServlet初始化(此图很重要,下面有用到)

当Web项目启动时,做初始化工作,所以我们大部分是配置在Web.xml里面,这样项目一启动,就会执行相关的初始化工作,下面是Web.xml代码

springMVC

org.springframework.web.servlet.DispatcherServlet

contextConfigLocation

classpath:Springmvc.xml

1

springMVC

(不拦截.jsp) 建议使用此种 方式 (拦截 .js.css .png) (放行静态资源) 3:/* 拦截所有请求(包括.jsp) 此种方式 不建议使用 -->

/

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

既然DispatcherServlet是一个servlet,那么就一定会有执行init,service等方法, DispatcherServlet继承了FrameworkServlet,FrameworkServlet继承了HttpServletBean,HttpServletBean继承了HttpServlet 类,而HttpServletBean类有一个入口点就是重写了init方法,如图所示:

init方法里有涉及到了BeanWrapper,PropertyValues,ResourceLoader。我这里大概介绍一下

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

2.BeanWrapper:封装了bean的行为,提供了设置和获取属性值,它有对应的BeanWrapperImpl

3.ResourceLoader:接口仅有一个getResource(String location)的方法,可以根据一个资源地址加载文件资源。classpath:这种方式指定SpringMVC框架bean配置文件的来源

4.1 PropertyValues

**

下面是PropertyValues源码讲解

public ServletConfigPropertyValues(ServletConfig config, SetrequiredProperties)

throws ServletException {

SetmissingProps = (requiredProperties != null && !requiredProperties.isEmpty()) ?

new HashSet(requiredProperties) : null;

//获取当前Servlet在web.xml中配置的名字,返回一个枚举对象

Enumerationen = config.getInitParameterNames();

//遍历

while (en.hasMoreElements()) {

//获取name,也就是我上图web.xml中的param-name里的值:contextConfigLocation

String property = en.nextElement();

//根据name获取值,也就是我上图web.xml中的param-value里的值:classpath:Springmvc.xml

Object value = config.getInitParameter(property);

addPropertyValue(new PropertyValue(property, value));

if (missingProps != null) {

missingProps.remove(property);

}

}

// Fail if we are still missing properties.

if (missingProps != null && missingProps.size() > 0) {

throw new ServletException(

"Initialization from ServletConfig for servlet '" + config.getServletName() +

"' failed; the following required properties were missing: " +

StringUtils.collectionToDelimitedString(missingProps, ", "));

}

}

}

如果想学习Java工程化、高性能及分布式、深入浅出。性能调优、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级程序员群:180705916,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容