Spring源码情操陶冶-自定义节点的解析
本文承接前文Spring源码情操陶冶-DefaultBeanDefinitionDocumentReader#parseBeanDefinitions,特开辟出一块新地来啃啃这块有意思的骨头
自定义节点的类型
我们常用的可分为spring/springmvc两类
- 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-基础支持抽象类
NamespaceHandlerSupport
是NamespaceHandler
接口的直接实现类,后续的自定义节点的解析类都是继承此类来进行扩展的。这里我们只关注NamespaceHandler
的两个实现方法init
和parse
init()
初始化方法,抽象类中并没有对其进行复写,主要由继承的子类去复写,目的是初始化自定义节点的相关解析类并保存至NamespaceHandlerSupport#parsers
map集合中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());
}
挑选几个重要的解析器来分析
- context:component-scan 文件扫描解析器>>>Spring源码情操陶冶-ComponentScanBeanDefinitionParser文件扫描解析器
- context:annotation-config 注解配置解析器>>>Spring源码情操陶冶-AnnotationConfigBeanDefinitionParser注解配置解析器
- context:property-placeholder 外部文件属性配置解析器>>>Spring源码情操陶冶-PropertyPlaceholderBeanDefinitionParser文件属性配置解析器
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());
}
挑选重要的几个解析器来分析
- mvc:annotation-driven mvc注解解析器>>>SpringMVC源码情操陶冶-AnnotationDrivenBeanDefinitionParser注解解析器
- mvc:interceptors 拦截器解析器>>>SpringMVC源码情操陶冶-InterceptorsBeanDefinitionParser拦截器解析器
- mvc:resources 静态资源解析器>>>SpringMVC源码情操陶冶-ResourcesBeanDefinitionParser静态资源解析器
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空间处理类
task:executor>>>Spring源码情操陶冶#task:executor解析器
task:scheduled-tasks、task:scheduler>>>Spring源码情操陶冶#task:scheduled-tasks解析器
TxNamespaceHandler-tx空间处理类
- tx:advice>>>Spring源码情操陶冶-tx:advice解析器
小结
通过分析spring与springmvc常用的自定义标签解析器,希望能帮助博主以及读者更好的了解spring与springmvc的工作原理,方便在分析问题时更加得心应手
Spring源码情操陶冶-自定义节点的解析的更多相关文章
- Spring源码情操陶冶-ComponentScanBeanDefinitionParser文件扫描解析器
承接前文Spring源码情操陶冶-自定义节点的解析,本文讲述spring通过context:component-scan节点干了什么事 ComponentScanBeanDefinitionParse ...
- Spring源码情操陶冶-AnnotationConfigBeanDefinitionParser注解配置解析器
本文承接前文Spring源码情操陶冶-自定义节点的解析,分析spring中的context:annotation-config节点如何被解析 源码概览 对BeanDefinitionParser接口的 ...
- Spring源码情操陶冶-PropertyPlaceholderBeanDefinitionParser注解配置解析器
本文针对spring配置的context:property-placeholder作下简单的分析,承接前文Spring源码情操陶冶-自定义节点的解析 spring配置文件应用 <context: ...
- Spring源码情操陶冶-AOP之ConfigBeanDefinitionParser解析器
aop-Aspect Oriented Programming,面向切面编程.根据百度百科的解释,其通过预编译方式和运行期动态代理实现程序功能的一种技术.主要目的是为了程序间的解耦,常用于日志记录.事 ...
- Spring源码情操陶冶#task:executor解析器
承接Spring源码情操陶冶-自定义节点的解析.线程池是jdk的一个很重要的概念,在很多的场景都会应用到,多用于处理多任务的并发处理,此处借由spring整合jdk的cocurrent包的方式来进行深 ...
- Spring源码情操陶冶-tx:advice解析器
承接Spring源码情操陶冶-自定义节点的解析.本节关于事务进行简单的解析 spring配置文件样例 简单的事务配置,对save/delete开头的方法加事务,get/find开头的设置为不加事务只读 ...
- Spring源码情操陶冶-AOP之Advice通知类解析与使用
阅读本文请先稍微浏览下上篇文章Spring源码情操陶冶-AOP之ConfigBeanDefinitionParser解析器,本文则对aop模式的通知类作简单的分析 入口 根据前文讲解,我们知道通知类的 ...
- Spring源码情操陶冶-AbstractApplicationContext#obtainFreshBeanFactory
前言-阅读源码有利于陶冶情操,本文承接前文Spring源码情操陶冶-AbstractApplicationContext 约束: 本文指定contextClass为默认的XmlWebApplicati ...
- Spring源码情操陶冶-ContextLoaderListener
前言:通过实例结合源码的方式解读,其中涉及到的文件来自于博主的Github毕设项目wxServer Note: Springboot应用不在本文章讨论范围 web.xml中启用Spring 在一般的w ...
随机推荐
- Spring框架学习笔记(9)——Spring对JDBC的支持
一.使用JdbcTemplate和JdbcDaoSupport 1.配置并连接数据库 ①创建项目并添加jar包,要比之前Spring项目多添加两个jar包c3p0-0.9.1.2.jar和mysql- ...
- 【端-iOS】给iOS开发入门者编码的一点建议
规范编码可以提高代码的可读性,降低维护成本.作为一个程序员,要对自己写的代码负责,虽然bug无可避免,但是写代码时最基本的编码规则还是应该遵守的,否则不是坑自己就是坑别人,因为代码肯定是要维护的. 下 ...
- HDU 2544 最短路(模板题——Floyd算法)
题目: 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你 ...
- 解决mysql不是内部或外部命令
安装Mysql后,当我们在cmd中敲入mysql时会出现'Mysql'不是内部或外部命令,也不是可运行的程序或其处理文件. 工具/原料 mysql cmd 方法/步骤 1 打开我的电脑在我的电脑右键中 ...
- dedecms织梦上传图片302Error错误
很多客户反馈这样的问题,上传图片的时候会提示302错误,找不到原因,很着急,秀站网小编分析下如下解决办法,希望能帮助大家. 解决问题: 1:空间满了,请查看空间容量是否满了. 2:权限问题... 很多 ...
- sqlite效率探测
在编译后当然就是使用sqlite,贸贸然去测试了一下创建数据库,插入数据,仅几条数据,发现,真不错的数据库,后来把数据量提高到10000的 时候,发现,怎么这么慢,后来自己都受不了,网上一查,原来是如 ...
- 如何判断NSDictionary是否包含某个键
方法一: if([[dictionary allKeys] containsObject:key){ // contains key} 方法二: if([dictionary objectFo ...
- VIM 自定义语法高亮配置
VIM 没有自动支持语法高亮,自己动手搞一搞,网上查了一堆资料,终于配置成功, 记录一下,以便后期查看. 总共两步: step1 : 定义语法规则 1)需要创建一个定义语法规则的文件,这个 actio ...
- Java 对二值化图片识别连通域
用Java 对 已经 二值化了的图片 标记连通域 每块的连通域都标记不一样的数字 public static void main(String [] args) throws IOException ...
- Centos 6.9安装配置MongoDB
注意:centos6上就不要装mongo3了,容易出错. 1. 下载 curl -O http://downloads.mongodb.org/linux/mongodb-linux-x86_64-2 ...