本文承接前文Spring源码情操陶冶-DefaultBeanDefinitionDocumentReader#parseBeanDefinitions,特开辟出一块新地来啃啃这块有意思的骨头

自定义节点的类型

我们常用的可分为spring/springmvc两类

  1. spring常用的节点类型
  • context类型
  1. context-component-scan-扫描包内的所有class类并注册为beanDefinition到spring上下文
  2. context-property-placeholder-加载外部的资源供spring调用,常用${}来使用外部文件的属性
  3. context-annotation-config-自动对注册的beanDefinition进行注解处理,常用context-component-scan来代替
  • aop类型

    aop-config-AOP模式使用配置
  • task类型
  1. task-annotation-driven-任务处理配置
  2. task-executor-任务线程池配置
  3. task-schedulertask-scheduled-tasks-预先任务处理配置
  1. springmvc常用的节点类型
  1. mvc-annotation-driven-mvc注解式配置,多与context-component-scan搭配使用
  2. mvc-interceptors-mvc拦截器配置
  3. mvc-resources-mvc静态资源访问配置
  4. mvc-freemarker-configurer/mvc-velocity-configurer/mvc-groovy-configurer-视图渲染器配置
  5. mvc-cors-跨域资源访问配置

NamespaceHandlerSupport-基础支持抽象类

NamespaceHandlerSupportNamespaceHandler接口的直接实现类,后续的自定义节点的解析类都是继承此类来进行扩展的。这里我们只关注NamespaceHandler的两个实现方法initparse

  • init()

    初始化方法,抽象类中并没有对其进行复写,主要由继承的子类去复写,目的是初始化自定义节点的相关解析类并保存至NamespaceHandlerSupport#parsersmap集合中

  • parse(Element element, ParserContext parserContext)

    主要调用方法,在Spring源码情操陶冶-DefaultBeanDefinitionDocumentReader#parseBeanDefinitions章节中我们提到其会调用NamespaceHandler的通用方法parse也就是此方法来进行相应节点的解析,代码如下

	@Override
public BeanDefinition parse(Element element, ParserContext parserContext) {
//找到相应的解析器并进行解析
return findParserForElement(element, parserContext).parse(element, parserContext);
}

顺藤摸瓜看下NamespaceHandlerSupport#findParserForElement方法

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解析器

常用的NamespaceHandler实现类

这里只分析ContextNamespaceHandler-spring context空间处理类MvcNamespaceHandler-springmvc空间处理类

ContextNamespaceHandler-context空间处理类

先瞧瞧代码,内部只有一个方法且也是复写方法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());
}

挑选几个重要的解析器来分析

MvcNamespaceHandler-springmvc空间处理类

瞧瞧代码

@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());
}

挑选重要的几个解析器来分析

AopNamespaceHandler-aop空间处理类

简单的瞅下代码

@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解析器

TaskNamespaceHandler-task空间处理类

TxNamespaceHandler-tx空间处理类

小结

通过分析spring与springmvc常用的自定义标签解析器,希望能帮助博主以及读者更好的了解spring与springmvc的工作原理,方便在分析问题时更加得心应手

Spring源码情操陶冶-自定义节点的解析的更多相关文章

  1. Spring源码情操陶冶-ComponentScanBeanDefinitionParser文件扫描解析器

    承接前文Spring源码情操陶冶-自定义节点的解析,本文讲述spring通过context:component-scan节点干了什么事 ComponentScanBeanDefinitionParse ...

  2. Spring源码情操陶冶-AnnotationConfigBeanDefinitionParser注解配置解析器

    本文承接前文Spring源码情操陶冶-自定义节点的解析,分析spring中的context:annotation-config节点如何被解析 源码概览 对BeanDefinitionParser接口的 ...

  3. Spring源码情操陶冶-PropertyPlaceholderBeanDefinitionParser注解配置解析器

    本文针对spring配置的context:property-placeholder作下简单的分析,承接前文Spring源码情操陶冶-自定义节点的解析 spring配置文件应用 <context: ...

  4. Spring源码情操陶冶-AOP之ConfigBeanDefinitionParser解析器

    aop-Aspect Oriented Programming,面向切面编程.根据百度百科的解释,其通过预编译方式和运行期动态代理实现程序功能的一种技术.主要目的是为了程序间的解耦,常用于日志记录.事 ...

  5. Spring源码情操陶冶#task:executor解析器

    承接Spring源码情操陶冶-自定义节点的解析.线程池是jdk的一个很重要的概念,在很多的场景都会应用到,多用于处理多任务的并发处理,此处借由spring整合jdk的cocurrent包的方式来进行深 ...

  6. Spring源码情操陶冶-tx:advice解析器

    承接Spring源码情操陶冶-自定义节点的解析.本节关于事务进行简单的解析 spring配置文件样例 简单的事务配置,对save/delete开头的方法加事务,get/find开头的设置为不加事务只读 ...

  7. Spring源码情操陶冶-AOP之Advice通知类解析与使用

    阅读本文请先稍微浏览下上篇文章Spring源码情操陶冶-AOP之ConfigBeanDefinitionParser解析器,本文则对aop模式的通知类作简单的分析 入口 根据前文讲解,我们知道通知类的 ...

  8. Spring源码情操陶冶-AbstractApplicationContext#obtainFreshBeanFactory

    前言-阅读源码有利于陶冶情操,本文承接前文Spring源码情操陶冶-AbstractApplicationContext 约束: 本文指定contextClass为默认的XmlWebApplicati ...

  9. Spring源码情操陶冶-ContextLoaderListener

    前言:通过实例结合源码的方式解读,其中涉及到的文件来自于博主的Github毕设项目wxServer Note: Springboot应用不在本文章讨论范围 web.xml中启用Spring 在一般的w ...

随机推荐

  1. POJ3258-River Hopscotch-二分

    这个题就是排排坐,二分就可以了... River Hopscotch Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 1325 ...

  2. 浏览器的统一指针事件:Pointer Event

    在早期的浏览器,输入的事件其实相对单纯,只有考虑到鼠标和键盘两种:而当时的鼠标事件,其实就是 click.mousedown.mouseup 等等的事件.但是当手机.平板开始流行时候,再移动装置上的主 ...

  3. 使用 SVG 和 JS 创建一个由星形变心形的动画

    序言:首先,这是一篇学习 SVG 及 JS 动画不可多得的优秀文章.我非常喜欢 Ana Tudor 写的教程.在她的教程中有大量使用 SVG 制作的图解以及实时交互 DEMO,可以说教程的所有细枝末节 ...

  4. 【Zigbee技术入门教程-01】Zigbee无线组网技术入门的学习路线

    [Zigbee技术入门教程-01]Zigbee无线组网技术入门的学习路线 广东职业技术学院  欧浩源 一.引言    在物联网技术应用的知识体系中,Zigbee无线组网技术是非常重要的一环,也是大家感 ...

  5. Docker+Jenkins持续集成环境(3)集成PMD、FindBugs、Checkstyle静态代码检查工具并邮件发送检查结果

    为了规范代码,我们一般会集成静态代码检测工具,比如PMD.FindBugs.Checkstyle,那么Jenkins如何集成这些检查工具,并把检查结果放到构建邮件里呢? 今天做了调研和实现,过程如下 ...

  6. 【程序员的吃鸡大法】利用OCR文字识别+百度算法搜索,玩转冲顶大会、百万英雄、芝士超人等答题赢奖金游戏

    [先上一张效果图]: 一.原理: 其实原理很简单: 1.手机投屏到电脑: 2.截取投屏画面的题目部分,进行识别,得到题目和三个答案: 3.将答案按照一定的算法,进行搜索,得出推荐答案: 4.添加了一些 ...

  7. Tomcat服务器的下载及安装

    Tomcat服务器的下载及安装 1)到apache官网.www.apache.org     http://jakarta.apache.org(产品的主页) 2) 安装版:window (exe.m ...

  8. phpstudy中的mysql

    1.进入mysql命令台,执行 select version()即可 2status;

  9. win7、win10进程pid4占用80端口的解决办法

    https://jingyan.baidu.com/article/7e4409533ffe092fc1e2ef10.html 今天想用wamp架设服务器,但是程序启动不起来,查看系统端口,80端口被 ...

  10. php表单提交并发送邮件给某个邮箱(示例源码)

    今天老板要求做一个需求,在官网上做一个页面提交的表单,并且当表单点击后,把表单的内容直接提交并通过发送邮件的方式到老板指定的邮箱,下面就分享 一下我的做法 首先建立一个html文档,把页面制作好,并且 ...