分析spring webmvc启动流程

分析spring webmvc启动流程

Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架。

一、Servlet注册

SpringMVC的核心就是DispatcherServlet,DispatcherServlet实质也是一个HttpServlet。DispatcherSevlet负责将请求分发,所有的请求都有经过它来统一分发。
在这里插入图片描述
用户向服务器发送请求,请求会到DispatcherServlet,DispatcherServlet 对请求URL进行解析,得到请求资源标识符(URI),然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括一个Handler处理器对象、多个HandlerInterceptor拦截器对象),最后以HandlerExecutionChain对象的形式返回。

DispatcherServlet可在WEB-INF目录下的web.xml中注册

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:app-context.xml</param-value>
</context-param>

<servlet>
    <servlet-name>api</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:app-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>api</servlet-name>
    <url-pattern>/api/*</url-pattern>
</servlet-mapping>

其中<context-param>代表的容器是spring本身的容器,用来声明应用范围(整个WEB项目)内的上下文初始化参数,param-name 设定上下文的参数名称,param-value 设定的参数名称的值。
<servlet>代表的容器为spring-mvc的子容器。其中<init-param>用于指定spring的配置文件。如果没有指定init-param属性,那么系统自动寻找的spring配置文件为[servlet-name]-servlet.xml。
<url-pattern>指定了servlet接管的url。其中/*可以匹配所有url,包括路径型的和后缀型的url。

二、IoC容器创建

IoC(Inversion of Control,IoC),控制反转,它是一个用来管理应用中核心对象的容器,这些核心对象在Spring中称为Spring Bean(简称Bean)。这个容器具备着以下两个功能:
1、通过描述管理Bean,包括发布和获取Bean;
2、通过描述完成Bean之前的依赖关系。

何为控制反转?在java中,如果要在A对象里面使用B对象,可以在A中new一个B对象,这种过程是一个正向的,那么反向就是A类不再主动去获取B,而是被动等待,等待IoC容器获取一个B的实例,然后反向的注入到A类中。一个更为准确的概念叫依赖注入(DI,Dependency Injection)。控制反转(IoC)和依赖注入(DI)是对同一件事情的不同描述,从某个方面讲,DI就是描述着IoC的过程。

在spring IOC容器的代表就是org.springframework.beans包中的BeanFactory接口,BeanFactory接口提供了IOC容器最基本功能,而org.springframework.context包下的ApplicationContext接口扩展了BeanFactory
ApplicationContext可通过此方法创建

ApplicationContext applicationContext = new AnnotationConfigApplicationContext(Homework.class)

三、Bean初始化

如上文中所说,由Spring容器负责创建、管理的这些Java对象被称为Bean。
Spring IOC容器管理Bean时,需要了解Bean的类名、名称、依赖项、属性、生命周期及作用域等信息。为此,Spring IOC提供了一系列配置项,用于Bean在IOC容器中的定义。
① class
该配置项是强制项,用于指定创建Bean实例的Bean类的路径。
② name
该配置项是强制项,用于指定Bean唯一的标识符,在基于 XML 的配置项中,可以使用 id和或 name 属性来指定 Bean唯一 标识符。
③ scope
该配置项是可选项,用于设定创建Bean对象的作用域。
④ constructor-arg
该配置项是可选项,用于指定通过构造函数注入依赖数据到Bean。
⑤ properties
该配置项是可选项,用于指定通过set方法注入依赖数据到Bean。
⑥ autowiring mode
该配置项是可选项,用于指定通过自动依赖方法注入依赖数据到Bean。
⑦ lazy-initialization mode
该配置项是可选项,用于指定IOC容器延迟创建Bean,在用户请求时创建Bean,而不要在启动时就创建Bean。
⑧ initialization
该配置项是可选项,用于指定IOC容器完成Bean必要的创建后,调用Bean类提供的回调方法对Bean实例进一步处理。
⑨ destruction
该配置项是可选项,用于指定IOC容器在销毁Bean时,调用Bean类提供的回调方法。

将Bean类添加到Spring IOC容器有三种方式。一种方式是基于XML的配置文件;一种方式是基于注解的配置;一种方式是基于Java的配置。
①XML
bean对象

public class HomeWork{
	
}

xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">
<bean class="com.java.code.class12.model.Homework" id="homework"></bean>
</beans>

②注解
首先需要在spring配置文件中加一行,作用是自动扫描base-package包下的注解

<context:component-scan base-package="com.java.code.class12.model"></context:component-scan>
@Component("Homework")
public class Homework {

}

③基于类的Java Config
首先需要在类头部使用@Configuration表明这个类是配置类,然后在类内部,使用@Bean注解返回一个bean

@Configuration  
public class Homework {   
    @Bean(“Student”)   
    public Student student() {   
        return new Student();   
    }   
}   

MVC的流程

在这里插入图片描述①:发起请求到前端控制器(DispatcherServlet)
②:前端控制器请求HandlerMapping查找 Handler (可以根据xml配置、注解进行查找)
③:处理器映射器HandlerMapping向前端控制器返回Handler,HandlerMapping会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象,多个HandlerInterceptor拦截器对象),通过这种策略模式,很容易添加新的映射策略
④:前端控制器调用处理器适配器去执行Handler
⑤:处理器适配器HandlerAdapter将会根据适配的结果去执行Handler
⑥:Handler执行完成给适配器返回ModelAndView
⑦:处理器适配器向前端控制器返回ModelAndView (ModelAndView是springmvc框架的一个底层对象,包括 Model和view)
⑧:前端控制器请求视图解析器去进行视图解析 (根据逻辑视图名解析成真正的视图(jsp)),通过这种策略很容易更换其他视图技术,只需要更改视图解析器即可
⑨:视图解析器向前端控制器返回View
⑩:前端控制器进行视图渲染 (视图渲染将模型数据(在ModelAndView对象中)填充到request域)
⑪:前端控制器向用户响应结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值