? 在spring 2.0 中,增加了自定義xml標記這一重大的功能。下面主要看一下spring 2.0實現這一功能的主要相關類:
?NamespaceHandlerResolver(接口)
??? 由DefaultBeanDefinitionDocumentReader使用,用于定位NamespaceHandler,指定特定的命名空間uri
?? 實現類:
?? DefaultNamespaceHandlerResolver
??
?? 通過map 保存所有的對應關系
?? 默認使用spring.handlers文件來保存所有的handlers
?? 可以定義其他的location 如:
?? String location = "org/springframework/beans/factory/xml/support/customNamespace.properties";
?? NamespaceHandlerResolver resolver = new DefaultNamespaceHandlerResolver(getClass().getClassLoader(), location);
??
?? NamespaceHandler(接口)
???
????? 基礎接口,用于DefaultBeanDefinitionDocumentReader處理自定義命名空間。
????? 方法:
???? ??? void init();
???????? 由DefaultBeanDefinitionDocumentReader調用在構造完后但在解析自定義元素前。
?
?? ????? BeanDefinition parse(Element element, ParserContext parserContext);
???????? 解析指定的元素。
?
?? ? ? ? BeanDefinitionHolder decorate(Node element,
??????????????????????????????????? BeanDefinitionHolder definition,
??????????????????????????????????? ParserContext parserContext);
???????? 執行相應的修飾。
?? 實現類:
????
???? NamespaceHandlerSupport(抽象類)
??
?? 主要的三個方法:
?? protected final void registerBeanDefinitionDecorator(
???????????????????????? String elementName,
???????????????????????? BeanDefinitionDecorator decorator)
?? 注冊decorator,通過element
?
?? protected final void registerBeanDefinitionDecoratorForAttribute(
????????????????????????? String attributeName,
????????????????????????? BeanDefinitionDecorator decorator)
??? 注冊decorator,通過attr
??
??? protected final void registerBeanDefinitionParser(
????????????????????????? String? elementName,
????????????????????????? BeanDefinitionParser parser)
??? 注冊BeanDefinitionParser,通過element
?? 實際的操作由具體的BeanDefinitionDecorator 或者BeanDefinitionParser 執行
? BeanDefinitionDecorator(接口)
?? 裝飾相關的自定義屬性。
???? AbstractInterceptorDrivenBeanDefinitionDecorator
????????? 用于注冊相應的Interceptor bean 定義,使用aop代理
? 其他類:
??? PluggableSchemaResolver,用于自定義相關的schema,默認的schema 保存于spring.schemas文件中
??? 可以通過覆蓋resolveEntity方法來裝載相應的自定義xsd文件
? 主要的執行類:
?
? XmlBeanDefinitionReader
?
??? 用于處理相應的讀取工作,其實主要的工作委派給BeanDefinitionDocumentReader
? 實際的類,就介紹到這,下一節通過實例來說明如何定義自定義xml 元素