栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringMvc源码分析--配置文件解析

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringMvc源码分析--配置文件解析

        我们简单分析一下springmvc配置解析过程,我个人认为理解这个过程对于后续学习是有帮助的,毕竟配置文件是入口。

一、认识springmvc.xml配置文件

        下面这个是springmvc中的配置,与spring的配置类似,只不过里面增加了springmvc特有的配置项,假设以default-servelt-handler举例说明。



    
    
        
        
    

    
 ...
二、入口 2.1、如何找到入口呢?

这里有简单说一下我的学习方式,具体有三种方式:

1)我们打开spring代码目录,可以通过代码目录进行猜测,因为spring的代码结构比较清晰,所以这种方式是最快的,虽然不能一次性找对,但多点几个文件也是可以找到的

2)搜索+断点调试

        这种方法如果如果匹配串准确度比较高,应该也能很快找到对应的文件,举个反例比如:搜bean可能会搜出很多文件,这样的字段就不是适合搜索。当我们找到怀疑的文件,就可以直接通过断点调试方式,来确定是不是最终能进到方法中。

2.2、注册解析器

springmvc配置文件中能用到的所有标签都在下面定义中

public class MvcNamespaceHandler extends NamespaceHandlerSupport {

	@Override
	public void init() {
		registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenBeanDefinitionParser());
		registerBeanDefinitionParser("default-servlet-handler", new DefaultServletHandlerBeanDefinitionParser());
		registerBeanDefinitionParser("interceptors", new InterceptorsBeanDefinitionParser());
		registerBeanDefinitionParser("resources", new ResourcesBeanDefinitionParser());
		registerBeanDefinitionParser("view-controller", new ViewControllerBeanDefinitionParser());
		registerBeanDefinitionParser("redirect-view-controller", new ViewControllerBeanDefinitionParser());
		registerBeanDefinitionParser("status-controller", new ViewControllerBeanDefinitionParser());
		registerBeanDefinitionParser("view-resolvers", new ViewResolversBeanDefinitionParser());
		registerBeanDefinitionParser("tiles-configurer", new TilesConfigurerBeanDefinitionParser());
		registerBeanDefinitionParser("freemarker-configurer", new FreeMarkerConfigurerBeanDefinitionParser());
		registerBeanDefinitionParser("groovy-configurer", new GroovyMarkupConfigurerBeanDefinitionParser());
		registerBeanDefinitionParser("script-template-configurer", new scriptTemplateConfigurerBeanDefinitionParser());
		registerBeanDefinitionParser("cors", new CorsBeanDefinitionParser());
	}

}
三、default-servlet-handler解析器

        由于default-servlet-handler解析器代码比较少并且在开发中肯定会用的,所以用这个进行分析。

class DefaultServletHandlerBeanDefinitionParser implements BeanDefinitionParser {
	@Override
	@Nullable
	public BeanDefinition parse(Element element, ParserContext parserContext) {
		Object source = parserContext.extractSource(element);

		String defaultServletName = element.getAttribute("default-servlet-name"); //获取属性的值
		//创建BeanDefinition
		RootBeanDefinition defaultServletHandlerDef = new RootBeanDefinition(DefaultServletHttpRequestHandler.class);
		defaultServletHandlerDef.setSource(source);
		defaultServletHandlerDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
		if (StringUtils.hasText(defaultServletName)) {
			defaultServletHandlerDef.getPropertyValues().add("defaultServletName", defaultServletName);
		}
		//注册到BeanDefinitionRegistry
		String defaultServletHandlerName = parserContext.getReaderContext().generateBeanName(defaultServletHandlerDef);
		parserContext.getRegistry().registerBeanDefinition(defaultServletHandlerName, defaultServletHandlerDef);
		parserContext.registerComponent(new BeanComponentDefinition(defaultServletHandlerDef, defaultServletHandlerName));

        //这里很关键,将处理器映射器和Servlet进行关联
		Map urlMap = new ManagedMap<>();
		urlMap.put("/**", defaultServletHandlerName); //处理所有请求

		//创建BeanDefinition,这个SimplerUrlHandlerMapping也是一个处理器映射器
		RootBeanDefinition handlerMappingDef = new RootBeanDefinition(SimpleUrlHandlerMapping.class);
		handlerMappingDef.setSource(source);
		handlerMappingDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
		handlerMappingDef.getPropertyValues().add("urlMap", urlMap);
		//注册到BeanDefinitionRegistry
		String handlerMappingBeanName = parserContext.getReaderContext().generateBeanName(handlerMappingDef);
		parserContext.getRegistry().registerBeanDefinition(handlerMappingBeanName, handlerMappingDef);
		parserContext.registerComponent(new BeanComponentDefinition(handlerMappingDef, handlerMappingBeanName));

		// Ensure BeanNameUrlHandlerMapping (SPR-8289) and default HandlerAdapters are not "turned off"
		MvcNamespaceUtils.registerDefaultComponents(parserContext, source);

		return null;
	}
}
四、总结

        本篇并没有分析太多的源码,介绍了一种看源码的方式,希望能帮助大家

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/704148.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号