网站维护中页面设计,wordpress 7天热门,中企动力总部,5173游戏交易网站源码一、使用示例
步骤1#xff1a;创建User实体 步骤2#xff1a;定义一个XSD文件描述组件内容 步骤3#xff1a;创建BeanDefinitionParser接口的实现类#xff0c;用来解析XSD文件中的定义和组件定义。 步骤4#xff1a;创建NamespaceHandlerSupport实现类#xff0c;目的…一、使用示例
步骤1创建User实体 步骤2定义一个XSD文件描述组件内容 步骤3创建BeanDefinitionParser接口的实现类用来解析XSD文件中的定义和组件定义。 步骤4创建NamespaceHandlerSupport实现类目的是将组件注册到Spring容器中。 步骤5编写spring.handlers和spring.schemas文件默认位置是/META-INF目录下 步骤6在配置文件oldbean.xml中引入对应的命名空间以及XSD之后就可以配置myname:user ... /了 步骤7进行测试 二、源码解析
在第2讲中我们已经介绍了关于默认标签的解析过程。那么我们还是需要将视角在回到parseBeanDefinitions(...)方法上来从下图源码截图中我们可以看出来我们首先是来判断root和root的子节点是否是默认表空间即通过delegate.isDefaultNamespace(...)来进行判断 【如果是默认表空间】执行默认标签解析——delegate.parseDefaultElement(ele, delegate); 【如果不是默认表空间】则执行自定义标签解析——delegate.parseCustomElement(ele); 下面我们来看一下parseCustomElement(...)方法的具体实现具体来说有如下3个步骤 【首先】获得namespaceUri,此处是通过org.w3c.dom.Node中的getNamespaceURI()方法进行获取的 【其次】获得解析该自定义标签的NamespaceHandler实现类。 【最后】调用该实现类的parse(...)方法进行解析操作。 2.1 getNamespaceURI(ele)方法解析
此方法是用于获得namespaceUri此处是通过org.w3c.dom.Node中的getNamespaceURI()方法进行获取的以使用示例中为例将会返回的namespaceUri“http://www.muse.com/schema/user”。 2.2 resolve(namespaceUri)方法解析
此方法是用来获得解析该自定义标签的NamespaceHandler实现类为下图中红框处代码 在此处的this.readerContext.getNamespaceHandlerResolver()方法中实际会返回DefaultNamespaceHandlerResolver实例对象。 上面我们了解了DefaultNamespaceHandlerResolver实例对象的创建过程之后那么下面我们就来分析一下它的resolve(namespaceUri)这个方法的内部实现下面是该方法的源码部分 在getHandlerMappings()方法中我们获得了系统加载的所有NamespaceHandler实例对象的映射映射关系为keyurivalueNamespaceHandler实现类。但是如果我们发现加载的handlerMappings等于null那么我们就需要去加载META-INF/spring.handlers文件中的配置信息将其生成NamespaceHandler实例对象的映射。所以综上所示getHandlerMappings()方法的主要功能就是读取spring.handlers的配置文件并将配置文件缓存在map中。 那么以我们的演示例子来说handlerMappings中是包含了11个xxxNamespaceHander实例对象的映射关系的在下图中红框部分就是我们自定义的UserNamespaceHandler。 那么在调用 namespaceHandler.init() 方法的时候其实调用的是UserNamespaceHandler实例的init()方法该方法是我们自己实现的。如下图所示 当我们调用 handlerMappings.put(namespaceUri, namespaceHandler) 方法时那么就将原本String类型的value值“com.muse.springbootdemo.UserNamespaceHandler”替换为UserNamespaceHandler实例对象了。如下图所示 2.3 parse(...)方法解析
下面我们再来看一下的parse(...)方法该方法是用来进行自定义标签的解析操作。 在parse(...)方法中我们可以看到首先是通过findParserForElement(element, parserContext)方法来找到localName对应的解析器。以我们上面的示例为例我们在oldbean.xml中配置的是myname:user iduser namemuse emailmuse163.com/那么获得了localName就等于“user”。由于我们在UserNamespaceHandler类中已经配置了user与UserBeanDefinitionParser实例对象的对应关系所以parser就拿它作为方法的返回值。具体详情请见下图所示 在上面的代码逻辑中我们已经获得到了parser示例对象UserBeanDefinitionParser实例对象那么我们通过调用parser对象的 parser(element, parserContext) 方法对自定义标签执行解析操作。下面是该方法涉及的源码部分 我们在上面可以看到对自定义标签进行解析是在parseInternal(element, parserContext)方法中执行的 在doParse(element, parserContext, builder)方法中执行了真正的自定义标签解析逻辑那么既然是自定义标签是无法通过Spring进行解析的而是需要我们自己提供自定义解析类XxxBeanDefinitionParser来实现doParse(...)方法的具体如下所示 今天的文章内容就这些了 写作不易笔者几个小时甚至数天完成的一篇文章只愿换来您几秒钟的 点赞 分享 。