`
keepaneye
  • 浏览: 40700 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Spirng 源代码学习笔记 Web 篇(二)HandlerMapping

 
阅读更多

Spirng 源代码学习笔记 Web 篇(二)HandlerMapping

HandlerMapping 负责将请求映射到实际处理对象。

 

当应用上下文中未配置 HandlerMapping 的实现类时,DispatcherServlet 在初始化时会根据DispatcherServlet.properties 的配置设置 Spring 自己的实现类。 

 

org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
	org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping

 

继承结构:


 

HandlerMapping

接口声明如下,入参为 request 对象,返回为 HandlerExecutionChain。 

 

HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;

  

HandlerExecutionChain 包含实际处理请求的对象和拦截器。实际处理请求的对象例子是普通的 Controller 对象;拦截器的例子:如对 http 返回设置统一的防止浏览器缓存头信息。

 

AbstractHandlerMapping

继承自 WebApplicationObjectSupport,支持 ordering, a default handler, and handler interceptors.

使用 template method:

 

	public final HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
		Object handler = getHandlerInternal(request);
		if (handler == null) {
			handler = getDefaultHandler();
		}
		if (handler == null) {
			return null;
		}
		// Bean name or resolved handler?
		if (handler instanceof String) {
			String handlerName = (String) handler;
			handler = getApplicationContext().getBean(handlerName);
		}
		return getHandlerExecutionChain(handler, request);
	}
	
	protected abstract Object getHandlerInternal(HttpServletRequest request) throws Exception;
	
protected HandlerExecutionChain getHandlerExecutionChain(Object handler, HttpServletRequest request) {
		if (handler instanceof HandlerExecutionChain) {
			HandlerExecutionChain chain = (HandlerExecutionChain) handler;
			chain.addInterceptors(getAdaptedInterceptors());
			return chain;
		}
		else {
			return new HandlerExecutionChain(handler, getAdaptedInterceptors());
		}
	}
 

 

AbstractUrlHandlerMapping

for URL-mapped。Provides infrastructure for mapping handlers to URLs;

Supports direct matches and various Ant-style pattern matches。

 

// 注册映射关系

protected void registerHandler(String urlPath, Object handler)

 

// 根据已注册的映射集合找到所有匹配项,并确定一个 best match

protected Object lookupHandler(String urlPath, HttpServletRequest request)

 

// 调用 lookupHandler,设置拦截器,返回 HandlerExecutionChain

protected Object getHandlerInternal(HttpServletRequest request)

 

SimpleUrlHandlerMapping

根据用户配置的 Map<String, Object> 集合,注册映射集合。

 

AbstractDetectingUrlHandlerMapping

扫描所有 spring 上下文中的 bean 实例,存在映射的自动进行注册。

再次 template method:

 

	protected void detectHandlers() throws BeansException {
		if (logger.isDebugEnabled()) {
			logger.debug("Looking for URL mappings in application context: " + getApplicationContext());
		}
		String[] beanNames = (this.detectHandlersInAncestorContexts ?
				BeanFactoryUtils.beanNamesForTypeIncludingAncestors(getApplicationContext(), Object.class) :
				getApplicationContext().getBeanNamesForType(Object.class));

		// Take any bean name that we can determine URLs for.
		for (String beanName : beanNames) {
			String[] urls = determineUrlsForHandler(beanName);
			if (!ObjectUtils.isEmpty(urls)) {
				// URL paths found: Let's consider it a handler.
				registerHandler(urls, beanName);
			}
			else {
				if (logger.isDebugEnabled()) {
					logger.debug("Rejected bean name '" + beanName + "': no URL paths identified");
				}
			}
		}
	}
	protected abstract String[] determineUrlsForHandler(String beanName);
 

 

BeanNameUrlHandlerMapping

beanName 映射,只处理以 “/” 开始的 beanName。

	protected String[] determineUrlsForHandler(String beanName) {
		List<String> urls = new ArrayList<String>();
		if (beanName.startsWith("/")) {
			urls.add(beanName);
		}
		String[] aliases = getApplicationContext().getAliases(beanName);
		for (String alias : aliases) {
			if (alias.startsWith("/")) {
				urls.add(alias);
			}
		}
		return StringUtils.toStringArray(urls);
	}
 

 

DefaultAnnotationHandlerMapping

类和方法上 RequestMapping 注解中的 value 值作为 url 的构成部分。

 

AbstractControllerUrlHandlerMapping

基于约定,面向 Controller 类型的映射。可配置不希望包含的类或者包。

Controller 类型是指实现了 org.springframework.web.servlet.mvc.Controller 接口或者类上使用了 @Controller 注解。

 

ControllerBeanNameHandlerMapping

根据 beanName 和配置的前缀、后缀作为映射的 url。

 

ControllerClassNameHandlerMapping

根据类的名称生成 url,可配置大小写敏感、路径前缀、basePackage。

org.springframework.web.servlet.mvc.Controller

  • WelcomeController -> /welcome*
  • HomeController -> /home*

For MultiActionControllers and @Controller beans

  • WelcomeController -> /welcome, /welcome/*
  • CatalogController -> /catalog, /catalog/*
  • 大小: 10.5 KB
分享到:
评论

相关推荐

    Spring+SpringMVC基础学习笔记(b站课程学习笔记)

    Spring框架的学习通常从理解其核心概念如IoC和AOP开始,然后深入到各个模块的应用,如数据访问(JdbcTemplate、Hibernate、MyBatis等)、Web开发(SpringMVC)和事务管理。在实际项目中,Spring常常与其他技术结合,...

    spring源码学习

    标题中的“spring源码学习”指的是对Spring框架的源代码进行深入研究,这通常是Java开发者为了更好地理解Spring的工作原理、优化应用性能或者进行二次开发所进行的活动。Spring是Java领域最广泛使用的轻量级开源框架...

    Spring框架.zip

    Spring框架是中国最流行的Java企业级应用开发框架,它由Rod Johnson在其著作《Expert One-on-One J2EE Design and Development》中...Spring笔记将帮助初学者逐步掌握这个强大的框架,为未来的Java开发打下坚实基础。

    Maven 构建SpringMVC项目学习笔记

    - **完善项目结构**:增加必要的源代码和资源目录,如`src/main/java`(存放Java源代码)、`src/test/resources`和`src/test/java`(存放测试资源和测试类)。同时,调整Eclipse中的项目配置,确保使用正确的JDK...

    10 Spring.doc

    本学习笔记将详细解析 Spring 框架的核心概念、功能和应用场景。 一、Spring 概述 1.1 Spring 框架的作用 Spring 主要提供了一个灵活的平台,用于管理对象的生命周期和依赖关系,实现了控制反转(IoC)和面向切面...

    mybatis12月7号课堂笔记.zip_mybatis_ssm框架笔记

    AOP则提供了在不修改源代码的情况下,对程序进行功能增强的能力,常用于日志记录、事务管理等。 Spring MVC是Spring框架的一部分,它是一个基于模型-视图-控制器(Model-View-Controller,MVC)设计模式的Web应用...

    SpringMvcHelloWorld.zip

    本项目"SpringMvcHelloWorld.zip"是2019年6月21日时的学习笔记源代码,旨在帮助开发者理解和掌握Spring MVC的基本用法,包括文件上传等常见功能。下面将详细阐述Spring MVC的关键概念、核心组件以及如何实现文件上传...

    传智 springmvc mybatis 燕青 笔记 教案 springmvc部分

    Spring MVC 是一款由 Spring 框架提供的轻量级 Web 开发组件,它主要用于构建 MVC(Model-View-Controller)模式的应用程序。在本教程中,我们主要关注 Spring MVC 的核心概念、工作原理以及如何与 MyBatis 集成进行...

    SpringMVC课堂笔记(1)

    **SpringMVC**是Spring框架中的一个重要组成部分,主要用于构建Web应用程序。它遵循MVC(Model-View-Controller)设计模式,帮助开发者构建出清晰分层的应用架构,提高代码的可维护性和可扩展性。 #### 二、...

    传智燕青springmvc2天教案+源码

    Spring MVC 是一个基于 Java 的轻量级 Web 开发框架,它是 Spring 框架的...通过本教程和源代码,你可以深入学习 Spring MVC 的工作原理,掌握如何创建和配置控制器,以及如何与数据库交互,进而构建完整的 Web 应用。

    SSM整合——个人笔记

    在"SSM整合——个人笔记"这个资源中,作者提供了整合SSM的源代码和详细注释,这对于初学者来说是非常宝贵的参考资料。通过阅读源码和笔记,你可以了解到每个组件的具体作用以及它们如何协同工作,从而更好地理解和...

    自学b站黑马ssm框架思维导图XMind笔记

    在"自学b站黑马ssm框架思维导图XMind笔记"中,我们可以深入学习SSM的核心概念和使用技巧。下面,我们将逐一解析每个文件所涵盖的知识点。 1. **02IoC&DI.xmind** —— 控制反转(IoC)与依赖注入(DI) - IoC:...

    springmvc课堂笔记

    **SpringMVC**是Spring框架中的一个重要组成部分,主要用于构建Web应用程序。它遵循MVC(Model-View-Controller)设计模式,帮助开发者构建出清晰分层的应用架构,提高代码的可维护性和可扩展性。 ##### 1.1 ...

    springmvc第一天课堂笔记

    SpringMVC是Spring框架的一个核心模块,它是一个基于Model-View-Controller(MVC)设计模式的Web应用框架。在B/S系统中,SpringMVC提供了一个灵活的方式来处理用户请求,将业务逻辑与表现层分离,从而降低了系统的...

    传智播客 Springmvc+Mybatis由浅入深 教案和笔记

    1. **配置数据源**:在Spring配置文件中定义数据源,用于连接数据库。 2. **配置SqlSessionFactory**:创建SqlSessionFactoryBean,它是MyBatis的工厂类,用于生成SqlSession。 3. **配置Mapper**:可以使用XML配置...

    springmvc第一天课堂笔记.docx

    ### SpringMVC基础知识详解 ...通过对SpringMVC的学习,开发者不仅能够快速构建出高效稳定的Web应用程序,还能深入了解MVC架构的优势所在。随着技术的发展,SpringMVC也在不断地更新和完善,为开发者提供更多便利。

Global site tag (gtag.js) - Google Analytics