文档章节

springMVC启动2

110hxl
 110hxl
发布于 2014/05/23 11:41
字数 376
阅读 44
收藏 1

在DispacthServlet类中的initHandlerMappings(context)前,RequestMappingHandlerMapping已经被初始化了;这个过程是怎么进行的呢;其实这个过程是在解析DispatchServlet的过程中,刷新IoC容器时初始化的;

刷新IoC容器在这个调用中触发,实例化单例


// Instantiate all remaining (non-lazy-init) singletons.				finishBeanFactoryInitialization(beanFactory);
List<String> beanNames = new ArrayList<String(this.beanDefinitionNames);
for (String beanName : beanNames) {
//循环生成(non-lazy-init)单例
}

List里的第一个就是RequestMappingHandlerMapping;

后面就是getBean操作;由于RequestMappingHandlerMapping间接的实现ApplicationContextAware

if (bean instanceof ApplicationContextAware) {
((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);
}

这里是把当前IoC容器给RequestMappingHanlderMapping让其可以去容器里查找映射;

经过一系列调用,然后是AbstractHandlerMethodMapping,initHandlerMethods方法进行方法扫描

/**
 * Scan beans in the ApplicationContext, detect and register handler methods.
 * @see #isHandler(Class)
 * @see #getMappingForMethod(Method, Class)
 * @see #handlerMethodsInitialized(Map)
 */
protected void initHandlerMethods() {
	if (logger.isDebugEnabled()) {
		logger.debug("Looking for request mappings in application context: " + getApplicationContext());
	}

	String[] beanNames = (this.detectHandlerMethodsInAncestorContexts ?
			BeanFactoryUtils.beanNamesForTypeIncludingAncestors(getApplicationContext(), Object.class) :
			getApplicationContext().getBeanNamesForType(Object.class));
	//循环找出映射
	for (String beanName : beanNames) {
		if (isHandler(getApplicationContext().getType(beanName))){
			detectHandlerMethods(beanName);
		}
	}
	handlerMethodsInitialized(getHandlerMethods());
}

扫描类;并查找映射信息;其中一个重要的类是RequestMappingHandlerMapping。中一个查找方法;

/**
 * Uses method and type-level @{@link RequestMapping} annotations to create
 * the RequestMappingInfo.
 * @return the created RequestMappingInfo, or {@code null} if the method
 * does not have a {@code @RequestMapping} annotation.
 * @see #getCustomMethodCondition(Method)
 * @see #getCustomTypeCondition(Class)
 */
@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
	RequestMappingInfo info = null;
	//查看方法名上是否有@RequestMapping
	RequestMapping methodAnnotation = AnnotationUtils.findAnnotation(method, RequestMapping.class);
	if (methodAnnotation != null) {
	//获取@RequestMapping上的信息
		RequestCondition<?> methodCondition = getCustomMethodCondition(method);
		info = createRequestMappingInfo(methodAnnotation, methodCondition);
		//获取类名上@RequestMapping的信息
		RequestMapping typeAnnotation = AnnotationUtils.findAnnotation(handlerType, RequestMapping.class);
		if (typeAnnotation != null) {
			RequestCondition<?> typeCondition = getCustomTypeCondition(handlerType);
			info = createRequestMappingInfo(typeAnnotation, typeCondition).combine(info);
		}
	}
	return info;
}




© 著作权归作者所有

上一篇: springMVC数据绑定
下一篇: springMVC启动
110hxl
粉丝 6
博文 211
码字总数 54059
作品 0
深圳
程序员
私信 提问
Spring Boot Starters启动器

Starters是什么? Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成Spring及其他技术,而不需要到处找示例代码和依赖包。如你想使用Spring JPA访问数...

Java技术栈
2018/06/10
77
0
Spring Boot功能实战

添加web功能启动器 添加了Spring Boot基础依赖后,如要使用web mvc功能,只需要添加如下启动器即可,Spring Boot会自动装配web功能。 添加启动类 然后添加启动类,建议放在根包下,这里把Con...

Java技术栈
2018/06/10
30
0
Spring Boot 的 10 个核心模块

学习 Spring Boot 必须得了解它的核心模块,和 Spring 框架一样,Spring Boot 也是一个庞大的项目,也是由许多核心子模块组成的。 你所需具备的基础 告诉你,Spring Boot 真是个牛逼货! Sp...

Java技术栈
2018/12/27
165
0
SpringBoot入坑指南之五:应用启动流程分析

概述 Spring Boot框架带来一个Web应用启动的重大变化。Java的Web应用部署都是通过容器,如:Tomcat、JBoss、Weblogic、Undertow等,一般都是将Java的Web应用构建成war、ear包再部署到相关的容...

centychen
02/15
95
1
Spring Boot的启动器Starter详解

Spring Boot的启动器Starter详解 Spring Boot应用启动器基本的一共有44种,具体如下: 1)spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置、日志和YAML。 2)spring-boot...

anlve
2018/02/22
157
0

没有更多内容

加载失败,请刷新页面

加载更多

64.监控平台介绍 安装zabbix 忘记admin密码

19.1 Linux监控平台介绍 19.2 zabbix监控介绍 19.3/19.4/19.6 安装zabbix 19.5 忘记Admin密码如何做 19.1 Linux监控平台介绍: 常见开源监控软件 ~1.cacti、nagios、zabbix、smokeping、ope...

oschina130111
今天
10
0
当餐饮遇上大数据,嗯真香!

之前去开了一场会,主题是「餐饮领袖新零售峰会」。认真听完了餐饮前辈和新秀们的分享,觉得获益匪浅,把脑子里的核心纪要整理了一下,今天和大家做一个简单的分享,欢迎感兴趣的小伙伴一起交...

数澜科技
今天
7
0
DNS-over-HTTPS 的下一代是 DNS ON BLOCKCHAIN

本文作者:PETER LAI ,是 Diode 的区块链工程师。在进入软件开发领域之前,他主要是在做工商管理相关工作。Peter Lai 也是一位活跃的开源贡献者。目前,他正在与 Diode 团队一起开发基于区块...

红薯
今天
8
0
CC攻击带来的危害我们该如何防御?

随着网络的发展带给我们很多的便利,但是同时也带给我们一些网站安全问题,网络攻击就是常见的网站安全问题。其中作为站长最常见的就是CC攻击,CC攻击是网络攻击方式的一种,是一种比较常见的...

云漫网络Ruan
今天
11
0
实验分析性专业硕士提纲撰写要点

为什么您需要研究论文的提纲? 首先当您进行研究时,您需要聚集许多信息和想法,研究论文提纲可以较好地组织你的想法, 了解您研究资料的流畅度和程度。确保你写作时不会错过任何重要资料以此...

论文辅导员
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部