Spring源码-Springmvc初始化handlerMapping


前言

发生在refresh方法的最后一步,发布上下文刷新事件的时候触发
1、创建XmlWebApplicationContext
2、调用refresh()方法
3、bean都创建完成后发布上下文刷新事件,开始初始化handlerMapping


一、springmvc初始化handlerMapping时序图

在这里插入图片描述


二、handlerMapping什么时候处理url和handler映射关系的?

首先在FrameworkServlet里初始化XmlWebApplicationContext实例,并会添加一个ContextRefreshContext事件到容器,在bean都创建完成后,上下文发布ContextRefreshContext事件,DispatcherServlet最终在initStrategies方法里初始化handlerMapping,如果容器中没有相应的handler实例,则获取默认handler实例并注入容器,默认handler创建如下:

在dispatcherServlet.properties文件里配置了handlerMapping的3个实现类全路径,然后使用applicationContext创建这三个类,其中有一个类BeanNameUrlHandlerMapping间接实现了ApplicationContextAware接口,在这个接口的setApplicationContext方法里最终执行的BeanNameUrlHandlerMapping的determineUrlsForHandler方法处理映射关系

另一个RequestMappingHandlerMapping在afterPropertersSet方法里初始化handlerMethod

1、扫描所有bean

2、判断类是否有@Controller或者@RequestMapping注解

3、生成HandlerMethod

AbstractHandlerMethodMapping实现了InitializingBean,在afterPropertiesSet()方法里,去发现controller的方法,并注册到自己的handlerMethods(LinkedHashMap)里面

总结

1、如果不配置handlerMapping实现类,那么会从DispatcherServlet.properties配置文件读取3个handlerMapping,并使用放入spring容器,在spring创建完bean后的回调接口里,开始解析url和handler映射
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Spring 6中使用Spring MVC的初始化案例。 1. 首先,确保你的项目中已经包含了Spring MVC和Jakarta Servlet API的依赖项。你可以在Maven或Gradle中添加以下依赖项: ```xml <!-- Maven 依赖项 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>6.0.0-M1</version> </dependency> <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>4.0.3</version> <scope>provided</scope> </dependency> ``` ```groovy // Gradle 依赖项 implementation 'org.springframework:spring-webmvc:6.0.0-M1' compileOnly 'jakarta.servlet:jakarta.servlet-api:4.0.3' ``` 2. 在Web应用程序中,需要在web.xml文件中配置Spring MVC的DispatcherServlet。以下是一个基本的web.xml文件示例: ```xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <display-name>Spring MVC Application</display-name> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring-mvc-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app> ``` 在这个示例中,我们定义了一个名为“dispatcherServlet”的Servlet,并将它映射到根路径“/”。其中,`servlet-class`是Spring MVC的`DispatcherServlet`类,`init-param`中的`contextConfigLocation`参数指定了Spring MVC配置文件的位置。 3. 创建Spring MVC配置文件`spring-mvc-config.xml`,并将其放置在WEB-INF目录下。以下是一个基本的Spring MVC配置文件示例: ```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" xmlns:mvc="http://www.springframework.org/schema/mvc" 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 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <context:component-scan base-package="com.example.controller"/> <mvc:annotation-driven/> </beans> ``` 在这个示例中,我们启用了Spring MVC的注解驱动(`<mvc:annotation-driven/>`),并使用`<context:component-scan>`扫描了一个名为`com.example.controller`的包,以寻找注解为`@Controller`的类。 4. 创建一个控制器类`HelloController`,并使用`@Controller`注解将其标记为Spring MVC控制器。以下是一个基本的控制器类示例: ```java package com.example.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class HelloController { @GetMapping("/hello") @ResponseBody public String hello() { return "Hello, Spring MVC!"; } } ``` 在这个示例中,我们使用`@Controller`注解将`HelloController`标记为一个Spring MVC控制器,并使用`@GetMapping`注解将`hello()`方法映射到路径`/hello`上。同时,使用`@ResponseBody`注解告诉Spring MVC将方法的返回值作为响应正文返回给客户端。 5. 启动你的Web应用程序,并在浏览器中访问`http://localhost:8080/hello`,你应该可以看到“Hello, Spring MVC!”的响应。 希望这个示例可以帮助你了解如何在Spring 6中使用Spring MVC。如果你还有其他问题,请随时提出。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值