<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    空間站

    北極心空

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks
    關于spring 2.0自定義xml 標記 (一 主要的相關類)

    在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 元素


    關于spring 2.0自定義xml 標記 (二 如何實現)

    看了spring test 用例,其實實現這一功能還算比較簡單,主要分以下的步驟,具體的實例可以去參考spring 自帶的testcase

    首先定義相關xsd文件,用于驗證相應的行為:

    主要增加了4個自定義元素和1個屬性:

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>

    <xsd:schema xmlns="http://www.springframework.org/schema/beans/test"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.springframework.org/schema/beans/test"
    elementFormDefault="qualified">

    <xsd:element name="testBean">
    <xsd:complexType>
    <xsd:attribute name="id" type="xsd:string" use="required" form="unqualified"/>
    <xsd:attribute name="name" type="xsd:string" use="required" form="unqualified"/>
    <xsd:attribute name="age" type="xsd:integer" use="required" form="unqualified"/>
    </xsd:complexType>
    </xsd:element>

    <xsd:element name="set">
    <xsd:complexType>
    <xsd:attribute name="name" type="xsd:string" use="required" form="unqualified"/>
    <xsd:attribute name="age" type="xsd:integer" use="required" form="unqualified"/>
    </xsd:complexType>
    </xsd:element>

    <xsd:element name="debug"/>
    <xsd:element name="nop"/>

    <xsd:attribute name="object-name" type="xsd:string"/>

    </xsd:schema>

    接著定義handler映射文件:customNamespace.properties

    http\://www.springframework.org/schema/beans/test=org.springframework.beans.factory.xml.support.TestNamespaceHandler

    定義Handler:

    主要注冊相應的解析類和裝飾類

     

    publicclass TestNamespaceHandler extends NamespaceHandlerSupport {

    publicvoid init() {

    //相對于每個xsd中定義的元素

    registerBeanDefinitionParser("testBean", new TestBeanDefinitionParser());

    registerBeanDefinitionDecorator("set", new PropertyModifyingBeanDefinitionDecorator());

    registerBeanDefinitionDecorator("debug", new DebugBeanDefinitionDecorator());

    registerBeanDefinitionDecorator("nop", new NopInterceptorBeanDefinitionDecorator());

    registerBeanDefinitionDecoratorForAttribute("object-name", new ObjectNameBeanDefinitionDecorator());

    }

    }

     

    定義各個解析類:

    privatestaticclass TestBeanDefinitionParser implements BeanDefinitionParser {

    public BeanDefinition parse(Element element, ParserContext parserContext) {

    RootBeanDefinition definition = new RootBeanDefinition();

    definition.setBeanClass(TestBean.class);

     

    MutablePropertyValues mpvs = new MutablePropertyValues();

    mpvs.addPropertyValue("name", element.getAttribute("name"));

    mpvs.addPropertyValue("age", element.getAttribute("age"));

    definition.setPropertyValues(mpvs);

     

    parserContext.getRegistry().registerBeanDefinition(element.getAttribute("id"), definition);

     

    returnnull;

    }

    }

    privatestaticclassPropertyModifyingBeanDefinitionDecorator implements BeanDefinitionDecorator {

    public BeanDefinitionHolder decorate(Node node, BeanDefinitionHolder definition,

    ParserContext parserContext) {

    Element element = (Element)node;

    BeanDefinition def = definition.getBeanDefinition();

     

    MutablePropertyValues mpvs = (def.getPropertyValues() == null) ?

    new MutablePropertyValues() : def.getPropertyValues();

    mpvs.addPropertyValue("name", element.getAttribute("name"));

    mpvs.addPropertyValue("age", element.getAttribute("age"));

     

    ((AbstractBeanDefinition) def).setPropertyValues(mpvs);

    return definition;

    }

    }

    privatestaticclassDebugBeanDefinitionDecorator extends AbstractInterceptorDrivenBeanDefinitionDecorator {

     

    protected BeanDefinition createInterceptorDefinition(Node node) {

    returnnew RootBeanDefinition(DebugInterceptor.class);

    }

    }

    privatestaticclassNopInterceptorBeanDefinitionDecorator extends

    AbstractInterceptorDrivenBeanDefinitionDecorator {

     

    protected BeanDefinition createInterceptorDefinition(Node node) {

    returnnew RootBeanDefinition(NopInterceptor.class);

    }

    }

    privatestaticclassObjectNameBeanDefinitionDecorator implements BeanDefinitionDecorator {

    public BeanDefinitionHolder decorate(Node node, BeanDefinitionHolder definition,

    ParserContext parserContext) {

    Attr objectNameAttribute = (Attr)node;

    definition.getBeanDefinition().setAttribute("objectName", objectNameAttribute.getValue());

    return definition;

    }

    }

     

    可以定義EntityResolver,用于驗證相應的xsd

    privateclass DummySchemaResolver extends PluggableSchemaResolver {

     

    public DummySchemaResolver() {

    super(CustomNamespaceHandlerTests.this.getClass().getClassLoader());

    }

     

    public InputSource resolveEntity(String publicId, String systemId) throws IOException {

    InputSource source = super.resolveEntity(publicId, systemId);

    if (source == null) {

    Resource resource =
    new ClassPathResource("org/springframework/beans/factory/xml/support/spring-test.xsd");

    source = new InputSource(resource.getInputStream());

    source.setPublicId(publicId);

    source.setSystemId(systemId);

    }

    return source;

    }

    }

    關鍵的一步,如何生效:

    String location = "org/springframework/beans/factory/xml/support/customNamespace.properties";

    NamespaceHandlerResolver resolver = new DefaultNamespaceHandlerResolver(
    getClass().getClassLoader(), location);

    DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();

    XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);

    reader.setNamespaceHandlerResolver(resolver);

    reader.setValidationMode(XmlBeanDefinitionReader.VALIDATION_XSD);

    reader.setEntityResolver(new DummySchemaResolver());

    reader.loadBeanDefinitions(getResource());

    寫一個測試xml文件:

    <?xmlversion="1.0"encoding="UTF-8"?>

    <beansxmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns:test="http://www.springframework.org/schema/beans/test"

    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd

    http://www.springframework.org/schema/beans/testhttp://www.springframework.org/schema/beans/factory/xml/support/spring-test.xsd">

    <test:testBeanid="testBean"name="Rob Harrop"age="23"/>

    <beanid="customisedTestBean"class="org.springframework.beans.TestBean">

    <test:setname="Rob Harrop"age="23"/>

    </bean>

    <beanid="debuggingTestBean"class="org.springframework.beans.TestBean">

    <test:debug/>

    <propertyname="name"value="Rob Harrop"/>

    <propertyname="age"value="23"/>

    </bean>

    <beanid="chainedTestBean"class="org.springframework.beans.TestBean">

    <test:debug/>

    <test:nop/>

    <propertyname="name"value="Rob Harrop"/>

    <propertyname="age"value="23"/>

    </bean>

    <beanid="decorateWithAttribute"class="org.springframework.beans.TestBean"test:object-name="foo"/>

    </beans>

    相關的測試方法:

    publicvoid testSimpleParser() throws Exception {

    TestBean bean = (TestBean) this.beanFactory.getBean("testBean");

    assetTestBean(bean);

    }

    publicvoid testSimpleDecorator() throws Exception {

    TestBean bean = (TestBean) this.beanFactory.getBean("customisedTestBean");

    assetTestBean(bean);

    }

    publicvoid testProxyingDecorator() throws Exception {

    ITestBean bean = (ITestBean) this.beanFactory.getBean("debuggingTestBean");

    assetTestBean(bean);

    assertTrue(AopUtils.isAopProxy(bean));

    Advisor[] advisors = ((Advised) bean).getAdvisors();

    assertEquals("Incorrect number of advisors", 1, advisors.length);

    assertEquals("Incorrect advice class.", DebugInterceptor.class, advisors[0].getAdvice().getClass());

    }

    publicvoid testChainedDecorators() throws Exception {

    ITestBean bean = (ITestBean) this.beanFactory.getBean("chainedTestBean");

    assetTestBean(bean);

    assertTrue(AopUtils.isAopProxy(bean));

    Advisor[] advisors = ((Advised) bean).getAdvisors();

    assertEquals("Incorrect number of advisors", 2, advisors.length);

    assertEquals("Incorrect advice class.", DebugInterceptor.class, advisors[0].getAdvice().getClass());

    assertEquals("Incorrect advice class.", NopInterceptor.class, advisors[1].getAdvice().getClass());

    }

    publicvoid testDecorationViaAttribute() throws Exception {

    RootBeanDefinition beanDefinition
    = (RootBeanDefinition)this.beanFactory.getBeanDefinition("decorateWithAttribute");

    assertEquals("foo", beanDefinition.getAttribute("objectName"));

    }

    privatevoid assetTestBean(ITestBean bean) {

    assertEquals("Invalid name", "Rob Harrop", bean.getName());

    assertEquals("Invalid age", 23, bean.getAge());

    }


    posted on 2007-11-02 12:56 蘆葦 閱讀(1455) 評論(0)  編輯  收藏 所屬分類: Spring
    主站蜘蛛池模板: 亚洲综合色区中文字幕| 四虎一区二区成人免费影院网址| 亚洲成a人片在线网站| 亚洲av色香蕉一区二区三区 | 亚洲黄色激情视频| 日本免费人成在线网站| 超清首页国产亚洲丝袜| 亚洲天堂2017无码中文| 亚洲日韩在线中文字幕综合| 免费无码又爽又刺激高潮视频 | 亚洲天堂免费在线| 青草草在线视频永久免费| 亚洲高清在线观看| 亚洲免费二区三区| 香蕉免费一区二区三区| 亚洲欧洲久久久精品| 亚洲码和欧洲码一码二码三码| **实干一级毛片aa免费| 亚洲国产精品福利片在线观看 | 久久久久亚洲AV无码网站| 一区二区三区免费看| 日韩免费三级电影| 亚洲AV色吊丝无码| 精品无码AV无码免费专区 | 亚洲视频一区在线| 日本道免费精品一区二区| 亚洲日本中文字幕天堂网| 国产精品亚洲色婷婷99久久精品| 日本成年免费网站| 亚洲日产2021三区在线| 在线播放免费播放av片| 亚洲а∨天堂久久精品9966| 国产小视频在线免费| 亚洲国产无线乱码在线观看| 青苹果乐园免费高清在线| 亚洲一区二区三区免费在线观看 | 免费H网站在线观看的| 亚洲精品无码高潮喷水A片软| 国产亚洲午夜高清国产拍精品| 日本免费xxxx色视频| 深夜免费在线视频|