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