通常我们在applicationContext.xml文件中使用spring的标签时,会发现spring默认支持的只有5种,如图所示 ?...这个时候就需要引入命名空间,我们到spring-context-xxx.jar的META-INF目录下找到spring.schemas文件,找到文件中的 http\://www.springframework.org.../schema/context/spring-context.xsd=org/springframework/context/config/spring-context.xsd 然后在applicationContext.xml...,如:http://www.sue.sc.com/schema/mytag,如果命名空间为空,则直接返回,如果不为空,则根据命名空间,获取对应的NamespaceHandler,调用parse方法进行自定义标签的解析...如果找不到,读取META-INF/spring.handlers中的配置,然后通过反射实例化对象。
这都依赖于Spring提供的XML Schema可扩展机制,用户可以自定义XML Schema文件,并自定义XML Bean解析器,并集成到SpringIOC容器中。...Spring在解析Bean的时候,会判断要解析的BeanDefinition是否属于默认的命名空间,例如标签。...中是怎么将各个XML Schema文件和NamespaceHandler对应起来的。...spring实现集成的,下面简单介绍这个流程 XML Schema文件 dubbo的XML Schema文件位于dubbo-config模块下的dubbo-config-spring模块中: ?...=org.apache.dubbo.config.spring.schema.DubboNamespaceHandler 其实就是定义了namespace url 和 NamespaceHandler
> 声明命名空间: 值得注意的是 xmlns 与 targetNamespace 可以是不存在,只要映射到指定 XSD 就行了。.../schema/battcn=com.battcn.handler.BattcnNamespaceHandler spring.schemas http\://www.battcn.com/schema...BeanDefinition parseCustomElement(Element ele, @Nullable BeanDefinition containingBd) { // 获取命名空间地址...(this.readerContext, this, containingBd)); } } 与默认标签解析规则一样的是,都是通过 getNamespaceURI(Nodenode) 来获取命名空间...() + "] interface"); } // 根据命名空间寻找对应的信息 NamespaceHandler
[5].编写名为application.xml的spring配置文件 [6].Maven Java项目的pom.xml....com.hafiz.zhang.tag.parser.ApplicationBeanDefinitionParser; 7 8 /** 9 * @author hafiz.Zhang 10 * @Date 2016年5月17日 下午12:22:57 11 * @Description 定义自定义的命名空间...extends NamespaceHandlerSupport { 14 15 @Override 16 public void init() { 17 //在这里进行注册自定义命名空间...; 9 10 /** 11 * @author hafiz.Zhang 12 * @Date 2016年5月17日 下午12:27:12 13 * @Description 在这里定义自定义命名空间的...[5].编写名为application.xml的spring配置文件 编写application.xml文件并放在classpath下,建议这样做,但不是必须放在该位置。 1 <?
命名空间找到了,命名空间handler又是怎么回事?...原来在spring的jar包中,在/META-INF/文件夹中有一个spring.handlers文件,这个文件记录了命名空间与具体handler类的对应关系。...一个命名空间不可能只有一种标签元素,如果就直接实现NamespaceHandler来解析beanDefinition,那代码可真不好看。...首先你得有自己的命名空间对应的xsd文件,然后引入到xml配置中,然后添加元素使用。其次,你得把你的xsd文件位置映射关系写到自己项目的/META-INF/spring.schemas中。.../spring.handlers文件中写上你的命名空间对应的自定义NamespaceHandler。
那 Dubbo 如何实现自定义 XML 被 Spring 加载读取? Spring XML Schema 扩展机制。...从 Spring 2.0 开始,Spring 开始提供了一种基于 XML Schema 格式扩展机制,用于定义和配置 bean。...Spring XML Schema 扩展机制 实现 Spring XML Schema 扩展,其实非常简单,只需要完成下面四步。...> 上面 XSD 文件中 http://www.test.com/demo 为自定义命名空间地址,下面将会使用到。...extends NamespaceHandlerSupport { @Override public void init() { // elementName 为命名空间
前言 很久没有写关于 Spring 的文章了,最近在系统梳理 Dubbo 代码的过程中发现了 XML schema 这个被遗漏的知识点。...这便牵扯出了今天的主题:Spring 对 XML schema 的扩展支持。 自定义 XML 扩展 为了搞懂 Spring 的 XML 扩展机制,最直接的方式便是实现一个自定义的扩展。...之后,还需要一个 NamespaceHandler 来帮助 Spring 解析 XML 中不同命名空间的各类元素。...NamespaceHandler 来处理,在今天的示例中,我们使用 KiritoNamespaceHandler 来解析 kirito 命名空间。...命名空间处理器的抽象实现,我粗略看了NamespaceHandler 的几个实现类,parse 和 decorate 方法可以完成元素节点的组装并通过 ParserContext 注册到 Ioc 容器中
按一般的套路通常是先介绍在Spring体系下如何在XML配置文件中自定义标签,本文先介绍Spring对于自定义标签的解析过程,在知道了Spring怎么“读”XML配置之后,写其能“读懂”的配置就显得非常自然了...NamespaceHandler for XML schema namespace [" + namespaceUri + "]", ele); return null; } return...Spring的类的命名和方法命名基本可以等同于注释了,我们可能已经开始猜测每个NameSpaceUri会对应一个NamespaceHandler,然后NamespaceHandler会负责解析该NameSpace...中,Support意味助手,意思是告诉大家在自定义NameSpaceHandler时欢迎继承我,我会帮你做很多事情喔lol),顾名思义,一个命名空间下可以定义很多个不同名标签,首先要找到这个element...同时由于XML验证机制有两种DTD和XSD,这里采用XSD,所以需要按照要求编写XSD文件,同时按照spring的要求,要在META-INF/spring.schemas文件中指定schema文件的位置
在该方法中,它会根据命名空间的不同调用不同的方法进行解析,如果是默认的命名空间,则调用 parseDefaultElement() 进行默认标签解析,否则调用 parseCustomElement()...NamespaceHandler for XML schema namespace [" + namespaceUri + "]", ele); return null;...this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri) getNamespaceHandlerResolver() 方法返回的命名空间的解析器...", err); } } } 首先调用 getHandlerMappings() 获取所有配置文件中的映射关系 handlerMappings ,该关系为 命名空间...,类路径>,然后根据命名空间 namespaceUri 从映射关系中获取相应的信息,如果为空或者已经初始化了就直接返回,否则根据反射对其进行初始化,同时调用其 init() 方法,最后将该 Handler
10-23 10:40:56,471 DEBUG [main] - Loaded NamespaceHandler mappings: {http://mybatis.org/schema/mybatis-spring...: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org...显然,在mybatis-spring.jar中spring.schemas定义的命名空间与spring-xxx.jar中spring.schemas定义的命名空间是不一样的,这就导致在程序启动 加载Spring...mybatis-spring=org.mybatis.spring.config.NamespaceHandler 解决方案 在maven-shade-plugin插件中通过Resource Transformers...=org.mybatis.spring.config.NamespaceHandler http\://www.springframework.org/schema/context=org.springframework.context.config.ContextNamespaceHandler
/beans“命名空间下元素及其属性,查看源码可以看到BeanDefinitionParserDelegate下面定义了一堆元素和属性名称,这些元素和属性名称分别可以在类中找到处理方法 public...String namespaceUri = getNamespaceURI(ele); //获取namespaceHandlerResolver然后根据命名空间得到具体的...for XML schema namespace [" + namespaceUri + "]", ele); return null; } /...; 主要作用就是 根据不同的命名空间来选择对应的解析器; /** * Locate the {@link NamespaceHandler} for the supplied namespace...//www.springframework.org/schema/context 命名空间对应的操作类是 ContextNamespaceHandler; 这个操作类会调用init()方法 @Override
import alias bean id & name处理 beanName生成 bean解析 Bean装饰 Bean注册 BeanDefiniton数据结构 beans 其它命名空间解析 NamespaceHandler...(schema)的命名空间其实类似于java的报名,命名空间采用URL,比如Spring的是这样: schema/beans"> xmlns属性就是xml规范定义的用来设置命名空间的。...默认命名空间解析 即import, alias, bean, 嵌套的beans四种元素。...其实使用了一个Map了保存其映射关系,key就是命名空间的uri,value是NamespaceHandler对象或是Class完整名,如果发现是类名,那么用反射的方法进行初始化,如果是NamespaceHandler
XML Schema文件,并自定义XML Bean解析器,集成到Spring IOC容器中。...2) 自定义标签的解析 ③编写NamespaceHandler 自定义标签解析,命名空间处理(这里有 RegNamespaceHandler和JobNamespaceHandler两种)和编写BeanDefinitionParser...用于命名空间下的Bean xml标签解析为BeanDefinition。...10.2 注册中心自定义NamespaceHandler的配置与说明 指定命名空间的标签定义好了,那标签中的元素与元素属性具体该如何处理可以看下:spring.handlers文件,一共有两行如下:...命名空间http\://www.dangdang.com/schema/ddframe/reg的标签解析类型为RegNamespaceHandler NamespaceHandler 命名空间处理
问题的原因是WebSessionFilter初始化时找不到对应的缓存。...但是整个过程我们并没有手动显式的去启动Ignite,是WebSessionFilter在Init的时候获取的,所以我们可以通过配置的方式将缓存首先创建。 如何指定Ignite XML文件加载?.../beans http://www.springframework.org/schema/beans/spring-beans.xsd">...结合Spring方式 对于使用Spring的应用是可以集成Ignite缓存的,配置方式需要通过一个缓存抽象类来完成org.apache.ignite.cache.spring.SpringCacheManager.... --> apache.ignite.cache.spring.SpringCacheManager"> <property
/beans/spring-beans.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo...是怎样被Spring来识别的? 如果我们自己随便定义一个标签Spring是否能够识别?我们去翻翻Spring的官网发现这玩意其实就是Spring提供的 XML schema 的扩展支持。...XML schema 扩展机制是什么?这个也许好多人没听过: Spring 为基于 XML 构建的应用提供了一种扩展机制,用于定义和配置 Bean。...在这个地方的时候我们其实可以以版本号来进行命名,方便我们可以使用多个不同的版本,Spring-beans 就是这么玩的。...编写一个 NamespaceHandler resources/META-INF/spring.handlers resources/META-IN/spring.schemas 测试自定义schema
将xml放到classPath下,所以我们直接从这个类开始就行,这就是优秀命名的好处。...node, BeanDefinitionHolder originalDef, @Nullable BeanDefinition containingBd) { //根据node获取到node的命名空间...NamespaceHandler for XML schema namespace [" + namespaceUri + "]", node); } else { // A custom...if (logger.isDebugEnabled()) { logger.debug("No Spring NamespaceHandler found for XML schema namespace...只需要创建一个我们的自定义标签和解析类,并指定它的命名空间以及NamespaceHandler,最后在META-INF/spring.handlers文件中指定命名空间和NamespaceHandler
NamespaceHandler for XML schema namespace 这其实是maven-assembly-plugin的一个BUG,详见:https://issues.apache.org...框架的项目,如果在执行java -jar package.jar时报错: Configuration problem: Unable to locate Spring NamespaceHandler...for XML schema namespace 原因:如果在多个jar包中存在同名文件,如:mybatis-spring.jar和spring-context.jar中都存在META-INF/spring.schemas...显然,mybatis-spring.jar中的spring.schemas定义的命名空间与spring-context.jar中spring.schemas定义的命名空间是不同的。...这会导致在加载Spring容器时无法找到合适的命名空间!
ShardingSphere 实现两种系统集成机制: 命名空间(namespace)机制,通过扩展 Spring Schema 来实现与 Spring 框架的集成 编写自定义 starter 组件完成与...Spring Boot 的集成 1 基于命名空间集成 Spring 扩展性角度,基于 XML Schema 的扩展机制常见而实用。...1.1 基于命名空间集成 Spring 的通用开发流程 基于命名空间机制实现与 Spring 的整合,开发通常采用固定流程: 编写业务对象 编写XSD文件 编写BeanDefinitionParser实现类...ShardingSphere 自身的http://shardingsphere.apache.org/schema/shardingsphere/encrypt,该命名空间的定义位于与 sharding.xsd...ShardingSphere 中基于命名空间机制与 Spring 进行系统集成的实现过程介绍完。
文件的命名空间是不是public static final String BEANS_NAMESPACE_URI = "http://www.springframework.org/schema/beans...文件中的一些命名空间的基本配置转换成DocumentDefaultsDefinition 对象; 例如 schema...public BeanDefinition parseCustomElement(Element ele, BeanDefinition containingBd) { //获取命名空间...String namespaceUri = getNamespaceURI(ele); //根据命名空间得到命名空间的处理类handler 如果是dubbo的uri...if (handler == null) { error("Unable to locate Spring NamespaceHandler for XML schema namespace
领取专属 10元无门槛券
手把手带您无忧上云