ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:67.06KB ,
资源ID:18963401      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/18963401.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Spring源码解析自定义标签解析Word文件下载.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Spring源码解析自定义标签解析Word文件下载.docx

1、 + contact= + contact + , serviceName= + serviceName + , serviceImplName= + serviceImplName + ;public class UserInfoService private String name = xu private int age = 18; public UserInfoService() public String getName() return name; public void setName(String name) this.name = name; public int getAg

2、e() return age; public void setAge(int age) this.age = age;UserInfoServicename= + name + , age= + age +元素的XSD文件schema xmlns=http:/www.w3.org/2001/XMLSchema targetNamespace= xmlns:tns= elementFormDefault=qualified attribute name=id type=string default= /contactserviceNameserviceImplName/complexType/e

3、lement/schemaHandler处理public class RpcServiceNamespaceHandler extends NamespaceHandlerSupport public void init() registerBeanDefinitionParser(, new RpcServicePublishBeanDefinitionParser();BeanDefinitionParserpublic class RpcServicePublishBeanDefinitionParser extends AbstractSingleBeanDefinitionParse

4、r protected void doParse(Element element, BeanDefinitionBuilder builder) String contact = element.getAttribute(); String serviceName = element.getAttribute( String serviceImplName = element.getAttribute( if (StringUtils.hasText(contact) builder.addPropertyValue(, contact); if (StringUtils.hasText(se

5、rviceName), serviceName); if (StringUtils.hasText(serviceImplName), serviceImplName); protected Class/beans注意添加,我的是Intellij,eclipse应该也有地方添加: Intellij:public class MyBeanTest public static void main(String args) throws ClassNotFoundException, IllegalAccessException, InstantiationException BeanFactory

6、 ctx = new XmlBeanFactory(new ClassPathResource(spring.xml); RpcService rpcService = ctx.getBean(,RpcService.class); System.out.println(rpcService); String rpcServiceImplName = rpcService.getServiceImpl(); UserInfoService userInfoService = (UserInfoService)Class.forName(rpcServiceImplName).newInstan

7、ce(); System.out.println(userInfoService);源码解析之前看beanfactory的解析的时候,解析标签的时候,会区分是默认的namespaces还是自定义的:/DefaultBeanDefinitionDocumentReaderprotected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) / 默认beans标签 if (delegate.isDefaultNamespace(root) NodeList nl = root.getChil

8、dNodes(); for (int i = 0; i nl.getLength(); i+) Node node = nl.item(i); if (node instanceof Element) Element ele = (Element) node; if (delegate.isDefaultNamespace(ele) parseDefaultElement(ele, delegate); else delegate.parseCustomElement(ele); /自定义标签 delegate.parseCustomElement(root);还是委托BeanDefiniti

9、onParserDelegate处理:public BeanDefinition parseCustomElement(Element ele) return parseCustomElement(ele, null);public BeanDefinition parseCustomElement(Element ele, BeanDefinition containingBd) / 获取uri String namespaceUri = getNamespaceURI(ele); / 根据uri获取处理handler NamespaceHandler handler = this.read

10、erContext.getNamespaceHandlerResolver().resolve(namespaceUri); if (ndler = null) error(Unable to locate Spring NamespaceHandler for XML schema namespace + namespaceUri + , ele); return null; / 解析标签,返回对应的beanDefinition return handler.parse(ele, new ParserContext(this.readerContext, this, containingBd

11、);getNamespaceHandlerResolver()-resolve/DefaultNamespaceHandlerResolverpublic NamespaceHandler resolve(String namespaceUri) /获取META-INF/spring.handlers所有配置的namespace的handler Map handlerMappings = getHandlerMappings(); /获取到自定义标签解析的handler Object handlerOrClassName = handlerMappings.get(namespaceUri);

12、 if (handlerOrClassName = null) else if (handlerOrClassName instanceof NamespaceHandler) return (NamespaceHandler) handlerOrClassName; String className = (String) handlerOrClassName; try Class handlerClass = ClassUtils.forName(className, this.classLoader); /如果不是NamespaceHandle的子类的话,抛异常 if (!Namespac

13、eHandler.class.isAssignableFrom(handlerClass) throw new FatalBeanException(Class + className + for namespace + namespaceUri + does not implement the + NamespaceHandler.class.getName() + interface /实例化NamespaceHandler NamespaceHandler namespaceHandler = (NamespaceHandler) BeanUtils.instantiateClass(h

14、andlerClass); /调用初始化注册beanDefinitionParser namespaceHandler.init(); handlerMappings.put(namespaceUri, namespaceHandler); return namespaceHandler; catch (ClassNotFoundException ex) NamespaceHandler class namespaceUri + not found, ex); catch (LinkageError err) Invalid NamespaceHandler class : problem

15、with handler class file or dependent class, err);/获取META-INF/spring.handlers所有配置的namespace的handlerprivate Map getHandlerMappings() if (this.handlerMappings = null) synchronized (this) /handlerMappingsLocation默认是META-INF/spring.handlers Properties mappings = PropertiesLoaderUtils.loadAllProperties(th

16、is.handlerMappingsLocation, this.classLoader); if (logger.isDebugEnabled() logger.debug(Loaded NamespaceHandler mappings: + mappings); handlerMappings = new ConcurrentHashMap(); CollectionUtils.mergePropertiesIntoMap(mappings, handlerMappings); this.handlerMappings = handlerMappings; catch (IOExcept

17、ion ex) throw new IllegalStateException(Unable to load NamespaceHandler mappings from location + this.handlerMappingsLocation + return this.handlerMappings;到这里获取到处理自定义标签的NamespaceHandler。NamespaceHandler-parse/NamespaceHandlerSupportpublic BeanDefinition parse(Element element, ParserContext parserCo

18、ntext) return findParserForElement(element, parserContext).parse(element, parserContext);/ 获取对应的beanDefinitionParse来解析对应的标签private BeanDefinitionParser findParserForElement(Element element, ParserContext parserContext) String localName = parserContext.getDelegate().getLocalName(element); /this.parse

19、rs需要我们在NamespaceHandler的init注册进来 BeanDefinitionParser parser = this.parsers.get(localName); if (parser = null) parserContext.getReaderContext().fatal(Cannot locate BeanDefinitionParser for element + localName + , element); return parser;/NamespaceHandler的init注册自定义标签的beanDefinitionParseprotected fina

20、l void registerBeanDefinitionParser(String elementName, BeanDefinitionParser parser) this.parsers.put(elementName, parser);看下BeanDefinition的parser方法:/AbstractBeanDefinitionParserpublic final BeanDefinition parse(Element element, ParserContext parserContext) /子类继承覆盖parseInternal完成解析BeanDefinition Abs

21、tractBeanDefinition definition = parseInternal(element, parserContext); if (definition != null & !parserContext.isNested() /bean的id,可以通过覆盖shouldGenerateId返回true,选择spring自己生成,要不然就自定义标签里面自己提供一个id String id = resolveId(element, definition, parserContext);StringUtils.hasText(id) parserContext.getReaderC

22、ontext().error(Id is required for element + parserContext.getDelegate().getLocalName(element) + when used as a top-level tag String aliases = new String0; String name = element.getAttribute(NAME_ATTRIBUTE); if (StringUtils.hasLength(name) aliases = StringUtils.trimArrayElements(StringUmaDelimitedLis

23、tToStringArray(name); BeanDefinitionHolder holder = new BeanDefinitionHolder(definition, id, aliases); /注册beanDefinition到spring registerBeanDefinition(holder, parserContext.getRegistry(); if (shouldFireEvents() BeanComponentDefinition componentDefinition = new BeanComponentDefinition(holder); postProcessComponentDefinition(componentDefinition); parserContext.registerComponent(

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1