文档章节

Spring MVC - 整体结构

i
 itititit
发布于 2017/08/25 10:11
字数 515
阅读 5
收藏 0

整体结构

  • XXXAware:在spring中表示感知,如果在某个类中需要XXX,就可以通过实现XXXAware接口高速spring,spring通过接口的唯一方法setXXX。
  • XXXCappable:表示具有提供XXX的能力,spring需要XXX时通过getXXX()获得。

HttpServletBean使用的是StandardServletEnvironment。

  

  1. ServletConfigPropertiesSource:封装的是ServletConfig。
  2. ServletContextPropertiesSource:封装的是ServletContext。
  3. JndiPropertiesSource:存放的是Jndi。
  4. MapPropertiesSource:存放的是虚拟机属性。
  5. SystemEnvironmentPropertiesSource:存放的是系统环境变量。

 

 

HttpServletBean

重写GenericServlet的模板方法init()。 

    public final void init() throws ServletException {
        if(this.logger.isDebugEnabled()) {
            this.logger.debug("Initializing servlet '" + this.getServletName() + "'");
        }

        try {
//将servlet中配置的参数封装到pvs
            PropertyValues pvs = new HttpServletBean.ServletConfigPropertyValues(this.getServletConfig(), this.requiredProperties);
            BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this);
            ResourceLoader resourceLoader = new ServletContextResourceLoader(this.getServletContext());
            bw.registerCustomEditor(Resource.class, new ResourceEditor(resourceLoader, this.getEnvironment()));
//模板方法,子类(DispatcherServlet)中调用(),bw代表DispatcherServlet
//但是子类未使用
            this.initBeanWrapper(bw);
//将配置的初始化参数设置到DispatcherServlet
            bw.setPropertyValues(pvs, true);
        } catch (BeansException var4) {
            this.logger.error("Failed to set bean properties on servlet '" + this.getServletName() + "'", var4);
            throw var4;
        }

//模板方法,子类初始化入口
        this.initServletBean();
        if(this.logger.isDebugEnabled()) {
            this.logger.debug("Servlet '" + this.getServletName() + "' configured successfully");
        }

    }

 

 

FrameworkServlet

初始化入口为initServletBean()。

    protected final void initServletBean() throws ServletException {
        this.getServletContext().log("Initializing Spring FrameworkServlet '" + this.getServletName() + "'");
        if(this.logger.isInfoEnabled()) {
            this.logger.info("FrameworkServlet '" + this.getServletName() + "': initialization started");
        }

        long startTime = System.currentTimeMillis();

        try {
            this.webApplicationContext = this.initWebApplicationContext();
            this.initFrameworkServlet();
        } catch (ServletException var5) {
            this.logger.error("Context initialization failed", var5);
            throw var5;
        } catch (RuntimeException var6) {
            this.logger.error("Context initialization failed", var6);
            throw var6;
        }

        if(this.logger.isInfoEnabled()) {
            long elapsedTime = System.currentTimeMillis() - startTime;
            this.logger.info("FrameworkServlet '" + this.getServletName() + "': initialization completed in " + elapsedTime + " ms");
        }

    }

核心代码就两句,initFrameworkServlet()是模板方法,但是子类并没有使用。那么主要的作用就是初始化webApplicationContext。

    protected WebApplicationContext initWebApplicationContext() {
//默认情况spring会将自己的容器设置为ServletContext的属性,直接通过ServletContex.getAttribute(key)获得容器
        WebApplicationContext rootContext = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());
        WebApplicationContext wac = null;
//第一种
//构造方法中已经设置,只需要对其进行一些设置
        if(this.webApplicationContext != null) {
            wac = this.webApplicationContext;
            if(wac instanceof ConfigurableWebApplicationContext) {
                ConfigurableWebApplicationContext cwac = (ConfigurableWebApplicationContext)wac;
                if(!cwac.isActive()) {
                    if(cwac.getParent() == null) {
                        cwac.setParent(rootContext);
                    }

                    this.configureAndRefreshWebApplicationContext(cwac);
                }
            }
        }
//第二种
        if(wac == null) {
            wac = this.findWebApplicationContext();
        }
//第三种,自己创建
        if(wac == null) {
            wac = this.createWebApplicationContext(rootContext);
        }

        if(!this.refreshEventReceived) {
            this.onRefresh(wac);
        }

        if(this.publishContext) {
            String attrName = this.getServletContextAttributeName();
            this.getServletContext().setAttribute(attrName, wac);
            if(this.logger.isDebugEnabled()) {
                this.logger.debug("Published WebApplicationContext of servlet '" + this.getServletName() + "' as ServletContext attribute with name [" + attrName + "]");
            }
        }

        return wac;
    }

initWebApplicationContext()做了三件事:

  1. 获取spring的根容器rootContext。
  2. 设置webApplicationContext,并按情况调用onRefresh()。
  3. 将webApplicationContext设置到ServletContext。

 

 

DispatcherServlet

 

 

 

 

© 著作权归作者所有

下一篇: 类加载机制
i
粉丝 0
博文 24
码字总数 15531
作品 0
私信 提问
Springboot返回html

注:Springboot的版本2.1.3.RELEASE List-1 application.properties文件 整体结构如下图1所示,html要放在static下,不是templates下                            ...

克虏伯
02/18
97
0
Spring MVC温故而知新 – 从零开始

Spring MVC简介 Spring MVC是一款基于MVC架构模式的轻量级Web框架,目的是将Web开发模块化,对整体架构进行解耦。 Spring MVC有一下优点: 作为Spring框架的一部分,拥有Spring的优点(IOC,A...

Java工程师-Distance
2018/05/18
105
0
Spring MVC原理及配置详解

【spring】Spring MVC原理及配置 1.Spring MVC概述: Spring MVC是Spring提供的一个强大而灵活的web框架。借助于注解,Spring MVC提供了几乎是POJO的开发模式,使得控制器的开发和测试更加简...

qq58edf1d989a2d
2018/06/26
0
0
MyBatis3-与Spring MVC 4集成

继前一篇的例子http://www.cnblogs.com/EasonJim/p/7052388.html,已经集成了Spring框架,现在将改造成Spring MVC的项目,并实现如下功能: 1、不用每次都手动指定具体的XML文件,而是采用通...

easonjim
2017/06/20
0
0
特别好用的swagger ui 封装

Swagger简单介绍 Swagger是一个Restful风格接口的文档在线自动生成和测试的框架 官网:http://swagger.io 官方描述:The World’s Most Popular Framework for APIs. Swagger ui 的原生UI界面...

huanshare
2018/08/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

浅谈prototype原型模式

一、原型模式简介 原型(Prototype)模式是一种对象创建型模式,他采取复制原型对象的方法来创建对象的实例。使用原型模式创建的实例,具有与原型一样的数据。 原型模式的特点: 1、由原型对...

青衣霓裳
24分钟前
6
0
shell mysql 备份

#!/bin/bash time2=$(date "+%Y-%m-%d-%H:%M:%S") /usr/local/mysql/bin/mysqldump -uroot -p ad > /usr/local/mysql/backup/"$time2".sql 变量引用原来是这么用的。......

奋斗的小牛
32分钟前
4
0
Jmeter监控Linux服务器操作

系统:Win7 64位 工具:Jmeter 4.0 要准备好的插件:JMeterPlugins-Standard-1.4.0,ServerAgent-2.2.1 解压JMeterPlugins-Standard-1.4.0.zip,将其中\lib\ext\JMeterPlugins-Standard.jar......

魔鬼妹子
32分钟前
5
0
系列文章:云原生Kubernetes日志落地方案

在Logging这块做了几年,最近1年来越来越多的同学来咨询如何为Kubernetes构建一个日志系统或者是来求助在这过程中遇到一系列问题如何解决,授人以鱼不如授人以渔,于是想把我们这些年积累的经...

Mr_zebra
33分钟前
5
0
入门必备!快速学会用Aspose.Words在表格中插入和删除列!

Aspose.Words For .Net(点击下载)是一种高级Word文档处理API,用于执行各种文档管理和操作任务。API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft W...

mnrssj
38分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部