本文承接前文Spring源码情操陶冶-DefaultBeanDefinitionDocumentReader#parseBeanDefinitions,特开辟出一块新地来啃啃这块有意思的骨头html
咱们经常使用的可分为spring/springmvc两类java
spring经常使用的节点类型spring
- context类型
context-component-scan
-扫描包内的全部class类并注册为beanDefinition到spring上下文context-property-placeholder
-加载外部的资源供spring调用,经常使用${}
来使用外部文件的属性context-annotation-config
-自动对注册的beanDefinition进行注解处理,经常使用context-component-scan
来代替
- aop类型
aop-config
-AOP模式使用配置- task类型
task-annotation-driven
-任务处理配置task-executor
-任务线程池配置task-scheduler
、task-scheduled-tasks
-预先任务处理配置
springmvc经常使用的节点类型跨域
mvc-annotation-driven
-mvc注解式配置,多与context-component-scan
搭配使用mvc-interceptors
-mvc拦截器配置mvc-resources
-mvc静态资源访问配置mvc-freemarker-configurer
/mvc-velocity-configurer
/mvc-groovy-configurer
-视图渲染器配置mvc-cors
-跨域资源访问配置
NamespaceHandlerSupport
是NamespaceHandler
接口的直接实现类,后续的自定义节点的解析类都是继承此类来进行扩展的。这里咱们只关注NamespaceHandler
的两个实现方法init
和parse
mvc
init()
初始化方法,抽象类中并无对其进行复写,主要由继承的子类去复写,目的是初始化自定义节点的相关解析类并保存至NamespaceHandlerSupport#parsers
map集合中cors
Spring源码情操陶冶-DefaultBeanDefinitionDocumentReader#parseBeanDefinitions
章节中咱们提到其会调用NamespaceHandler
的通用方法parse
也就是此方法来进行相应节点的解析,代码以下@Override public BeanDefinition parse(Element element, ParserContext parserContext) { //找到相应的解析器并进行解析 return findParserForElement(element, parserContext).parse(element, parserContext); }
顺藤摸瓜看下NamespaceHandlerSupport#findParserForElement
方法ide
private BeanDefinitionParser findParserForElement(Element element, ParserContext parserContext) { //通常都是相似context-component-scan、mvc-resources这样的节点名 String localName = parserContext.getDelegate().getLocalName(element); //此处显而易见可察觉经过parsers这个map集合获取相应的解析器 BeanDefinitionParser parser = this.parsers.get(localName); if (parser == null) { parserContext.getReaderContext().fatal( "Cannot locate BeanDefinitionParser for element [" + localName + "]", element); } return parser; }
由此得出咱们能够稍微密切关注下子类对init()
方法的复写,即可得出相关的自定义节点对应的BeanDefinitionParser
解析器this
这里只分析ContextNamespaceHandler-spring context空间处理类
、MvcNamespaceHandler-springmvc空间处理类
spa
先瞧瞧代码,内部只有一个方法且也是复写方法init()
线程
@Override public void init() { registerBeanDefinitionParser("property-placeholder", new PropertyPlaceholderBeanDefinitionParser()); registerBeanDefinitionParser("property-override", new PropertyOverrideBeanDefinitionParser()); registerBeanDefinitionParser("annotation-config", new AnnotationConfigBeanDefinitionParser()); registerBeanDefinitionParser("component-scan", new ComponentScanBeanDefinitionParser()); registerBeanDefinitionParser("load-time-weaver", new LoadTimeWeaverBeanDefinitionParser()); registerBeanDefinitionParser("spring-configured", new SpringConfiguredBeanDefinitionParser()); registerBeanDefinitionParser("mbean-export", new MBeanExportBeanDefinitionParser()); registerBeanDefinitionParser("mbean-server", new MBeanServerBeanDefinitionParser()); }
挑选几个重要的解析器来分析
瞧瞧代码
@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("velocity-configurer", new VelocityConfigurerBeanDefinitionParser()); registerBeanDefinitionParser("groovy-configurer", new GroovyMarkupConfigurerBeanDefinitionParser()); registerBeanDefinitionParser("script-template-configurer", new ScriptTemplateConfigurerBeanDefinitionParser()); registerBeanDefinitionParser("cors", new CorsBeanDefinitionParser()); }
挑选重要的几个解析器来分析
简单的瞅下代码
@Override public void init() { // In 2.0 XSD as well as in 2.1 XSD. registerBeanDefinitionParser("config", new ConfigBeanDefinitionParser()); registerBeanDefinitionParser("aspectj-autoproxy", new AspectJAutoProxyBeanDefinitionParser()); registerBeanDefinitionDecorator("scoped-proxy", new ScopedProxyBeanDefinitionDecorator()); // Only in 2.0 XSD: moved to context namespace as of 2.1 registerBeanDefinitionParser("spring-configured", new SpringConfiguredBeanDefinitionParser()); }
此处咱们就简单的分析aop-config
节点对应的解析器>>>Spring源码情操陶冶-AOP之ConfigBeanDefinitionParser解析器
task:executor>>>Spring源码情操陶冶#task:executor解析器
task:scheduled-tasks、task:scheduler>>>Spring源码情操陶冶#task:scheduled-tasks解析器
经过分析spring与springmvc经常使用的自定义标签解析器,但愿能帮助博主以及读者更好的了解spring与springmvc的工做原理,方便在分析问题时更加驾轻就熟