最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Spring開發(fā)之自定義標(biāo)簽及其解析

 更新時間:2017年04月25日 08:57:50   作者:lizo  
Spring框架是現(xiàn)在Java最流行的開源框架之一,需要實現(xiàn)一些自定義的標(biāo)簽,主要是方便使用我們框架的人能夠快速、簡單進行配置,有興趣的可以了解一下。

Spring框架是現(xiàn)在Java最流行的開源框架之一,并且Spring下的各種子項目對某些特定問題的解決有很好的支持。因此,如果能在Spring 基礎(chǔ)上實現(xiàn)搭建自己的一套框架(基于XML配置)。就必然需要實現(xiàn)一些自定義的標(biāo)簽,主要是方便使用我們框架的人能夠快速、簡單進行配置。

1. XML Schema

要想自定義標(biāo)簽,首先第一步需要寫自己的XML Schema。XML Schema的個人感覺比較復(fù)雜,網(wǎng)上的教程比較簡單,因此可以參照spring-beans.xsd依葫蘆畫瓢。這里就按照我自己的理解進行簡單介紹一下吧。

1.1 最簡單的標(biāo)簽

一個最簡單的標(biāo)簽,形式如:

<bf:head-routing key="1" value="1" to="test2"/>

該標(biāo)簽只包含了若干屬性,我們就在xsd文件中這么定義

<!-- 聲明一個標(biāo)簽,名字為head-routing,他的類型為headRouting-->
<xsd:element name="head-routing" type="headRouting"></xsd:element>

  <!-- 定義head-routing的類型,這里定義它有key,value,to,patten四個屬性 -->
  <xsd:complexType name="headRouting">
    <xsd:attribute name="key" type="xsd:string" use="required"></xsd:attribute>
    <xsd:attribute name="value" type="xsd:string" use="required"></xsd:attribute>
    <xsd:attribute name="to" type="xsd:IDREF" use="required"></xsd:attribute>
    <xsd:attribute name="patten" type="xsd:string" default="string"></xsd:attribute>
  </xsd:complexType>

在<xsd:attribute>標(biāo)簽中的type是用來定義該屬性的格式,例如

  1. xsd:string 表示是一個字符串,對格式?jīng)]什么要求
  2. xsd:id 表示該屬性的值是一個id,有格式要求(例如不能以數(shù)字開頭)。
  3. xsd:IDREF 表示該屬性的值與某xsd:id屬性的值對應(yīng)
  4. 其他還有很多,例如number,double,datetime等等。

1.2 復(fù)雜點的標(biāo)簽

所謂復(fù)雜,其實就是嵌套的標(biāo)簽,形式如:

  <bf:stop id="test1" ref="testNode">
    <bf:head-routing key="1" value="1" to="test2"/>
  </bf:stop>

其實只要參照Spring 中<bean>標(biāo)簽的xsd依葫蘆畫瓢,首先是定義stop標(biāo)簽

  <xsd:element name="stop">
    <xsd:complexType>
      <xsd:complexContent>
        <xsd:extension base="beans:identifiedType">
          <xsd:group ref="stopElements"/>
          <xsd:attributeGroup ref="stopAttributes"/>
        </xsd:extension>
      </xsd:complexContent>
    </xsd:complexType>
  </xsd:element>

其中,

<xsd:extension base="beans:identifiedType"> 定義了該標(biāo)簽的id屬性,注意這里引用的是spring-beans中的type,
<xsd:group ref="stopElements"/>中定義了<bf:stop>標(biāo)簽允許的子標(biāo)簽
<xsd:attributeGroup ref="stopAttributes"/> 定義了<bf:stop>標(biāo)簽允許的屬性
  <xsd:group name="stopElements">
    <xsd:sequence>
      <xsd:element ref="description" minOccurs="0"/>
      <xsd:choice minOccurs="0" maxOccurs="unbounded">
        <xsd:element ref="head-routing"/>
         <!-- 有更多的子標(biāo)簽繼續(xù)在這里添加,例如<xsd:element ref="properties"/> -->
      </xsd:choice>
    </xsd:sequence>
  </xsd:group>


  <xsd:attributeGroup name="stopAttributes">
    <xsd:attribute name="ref" type="xsd:IDREF" use="required">
      <xsd:annotation>         
        <xsd:appinfo>
           <!-- 這里是使用了Spring tool xsd中的標(biāo)簽,格式校驗-->
          <tool:annotation kind="ref">
            <tool:expected-type type="com.lizo.node.Station"/>
          </tool:annotation>
        </xsd:appinfo>
      </xsd:annotation>
    </xsd:attribute>
    <!-- 有更多的子標(biāo)簽繼續(xù)在這里添加,例如<xsd:attribute name="value" type="xsd:string"/> -->

2. 配置文件

完成了xsd文件編寫后,還需要讓該文件生效,就需要在項目的resource/META-INF包里面配置2個文件spring.handlers和spring.schemas

2.1 spring.schemas

改配置文件主要是用一個url來映射我們第一步配置好的文件,形式如下

http\://www.lizo.com/schema/bf.xsd=META-INF/bf.xsd

這樣,就可以在Spring的xml配置文件中加入spring.schemas的url,省略掉其他的,在<beans>標(biāo)簽中增加如下信息

<beans
    ..
    xmlns:bf="http://www.lizo.com/schema/bf"
    xsi:schemaLocation="
    ...
    http://www.lizo.com/schema/bf
    http://www.lizo.com/schema/bf.xsd
    ">

完成這步以后,就可以在xml中寫自己的標(biāo)簽了,例如自定義標(biāo)簽的namespace為bf,

  <bf:stop id="test123" ref="testNode">
    <bf:head-routing key="1" value="1" to="test1"/>
    <bf:head-routing key="3" value="4" to="test2"/>
  </bf:stop>

2.2 spring.handlers

這個配置文件用來配置解析我們bf標(biāo)簽,然后生成一些BeanDefinition進行注冊。例如

http\://www.lizo.com/schema/bf=com.lizo.config.BusinessFlowNamespaceHandlerSupport

其中 BusinessFlowNamespaceHandlerSupport就是我們用來解析標(biāo)簽

3. 自定義標(biāo)簽解析

在上一步中,我們配置了com.lizo.config.BusinessFlowNamespaceHandlerSupport類作為解析自定義標(biāo)簽的類,所以namespace為bf的標(biāo)簽,都會用這里注冊的標(biāo)簽解析器來解析

public class BusinessFlowNamespaceHandlerSupport extends NamespaceHandlerSupport {
  public void init() {
    //注冊用于解析<bf:stop>的解析器
    registerBeanDefinitionParser("stop", new BusinessFlowBeanDefinitionParser());
  }
}

我們自定義的標(biāo)簽解析器BusinessFlowBeanDefinitionParser是要實現(xiàn)BeanDefinitionParser 接口的

public interface BeanDefinitionParser {
  BeanDefinition parse(Element element, ParserContext parserContext);
}

一般來說,注冊bean的基本流程為:

  1. 解析標(biāo)簽
  2. 根據(jù)解析的值生成BeanDefinition,
  3. 注冊標(biāo)簽

解析標(biāo)簽就不用說,重點說說怎么生成BeanDefinition

3.1 生成BeanDefinition

一個最簡單的BeanDefinition通過設(shè)置Class和屬性的注入就可以完成。如下:

RootBeanDefinition nodeWrapDefinition = new RootBeanDefinition();
//該BeanDefinition對應(yīng)的是什么類
nodeWrapDefinition.setBeanClass(StationRoutingWrap.class);
//name是解析標(biāo)簽后獲得的值
nodeWrapDefinition.getPropertyValues().addPropertyValue("name", name);

RuntimeBeanReference

RuntimeBeanReference 用于在運行時去獲取BeanDefinition,因為在我們創(chuàng)建這個BeanDefinition的時候我們只知道他的beanName,并不確定是否已經(jīng)注冊了,這個時候就需要用RuntimeBeanReference,例如

RuntimeBeanReference refBean = new RuntimeBeanReference(ref);
    nodeWrapDefinition.getPropertyValues().addPropertyValue("station", refBean);

集合類BeanDefinition

某個BeanDefinition注入的屬性為一個List,這個時候就需要用ManagedList(同理有ManagedMap,ManagedSet),

ManagedList routingConditions = new ManagedList();
....
nodeWrapDefinition.getPropertyValues().add("routing", routing);

3.2 注冊bean

注冊BeanDefinitionParser 接口的函數(shù)中有個參數(shù)ParserContext,有個方法為getRegistry(),因此,注冊bean的時候就很簡單了

復(fù)制代碼 代碼如下:

parserContext.getRegistry().registerBeanDefinition("beanName",nodeWrapDefinition);

總結(jié)

通過以上三步,就可以實現(xiàn)自己定義標(biāo)簽,并且在Spring容器中注入相關(guān)的bean。讓我們的框架使用起來更方便

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • JavaWeb項目FullCalendar日歷插件使用的示例代碼

    JavaWeb項目FullCalendar日歷插件使用的示例代碼

    本篇文章主要介紹了JavaWeb項目FullCalendar日歷插件使用的示例代碼,具有一定的參考價值,有興趣的可以了解一下
    2017-08-08
  • Spring循環(huán)依賴的處理方法

    Spring循環(huán)依賴的處理方法

    循環(huán)依賴是指兩個或多個組件之間相互依賴,形成一個閉環(huán),從而導(dǎo)致這些組件無法正確地被初始化或加載,這篇文章主要介紹了Spring循環(huán)依賴的處理,需要的朋友可以參考下
    2023-08-08
  • IDEA在一個工作空間中管理多個項目的詳細步驟

    IDEA在一個工作空間中管理多個項目的詳細步驟

    這篇文章主要介紹了IDEA在一個工作空間中管理多個項目的詳細步驟,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • Java鎖機制Lock用法示例

    Java鎖機制Lock用法示例

    這篇文章主要介紹了Java鎖機制Lock用法,結(jié)合具體實例形式分析了Java鎖機制的相關(guān)上鎖、釋放鎖、隱式鎖、顯式鎖等概念與使用技巧,需要的朋友可以參考下
    2018-08-08
  • JavaWeb?Listener?利用Session統(tǒng)計在線人數(shù)

    JavaWeb?Listener?利用Session統(tǒng)計在線人數(shù)

    這篇文章主要為大家介紹了JavaWeb?Listener?利用Session統(tǒng)計在線人數(shù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Java中的讀寫鎖ReentrantReadWriteLock源碼分析

    Java中的讀寫鎖ReentrantReadWriteLock源碼分析

    這篇文章主要介紹了Java中的讀寫鎖ReentrantReadWriteLock源碼分析,ReentrantReadWriteLock 分為讀鎖和寫鎖兩個實例,讀鎖是共享鎖,可被多個線程同時使用,寫鎖是獨占鎖,持有寫鎖的線程可以繼續(xù)獲取讀鎖,反之不行,需要的朋友可以參考下
    2023-12-12
  • 三分鐘帶你了解SpringBoot真正的啟動引導(dǎo)類

    三分鐘帶你了解SpringBoot真正的啟動引導(dǎo)類

    這篇文章主要介紹了三分鐘帶你了解SpringBoot真正的啟動引導(dǎo)類,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Seata集成Mybatis-Plus解決多數(shù)據(jù)源事務(wù)問題

    Seata集成Mybatis-Plus解決多數(shù)據(jù)源事務(wù)問題

    當(dāng)進行業(yè)務(wù)操作時,訂單發(fā)生異常 ,進行了回滾操作,因為在不同的數(shù)據(jù)庫實例中,余額卻扣除成功,此時發(fā)現(xiàn)數(shù)據(jù)不一致問題,本文給大家介紹Seata集成Mybatis-Plus解決多數(shù)據(jù)源事務(wù)問題,感興趣的朋友一起看看吧
    2023-11-11
  • 深入理解java動態(tài)代理的兩種實現(xiàn)方式(JDK/Cglib)

    深入理解java動態(tài)代理的兩種實現(xiàn)方式(JDK/Cglib)

    本篇文章主要介紹了java動態(tài)代理的兩種實現(xiàn)方式,詳細的介紹了JDK和Cglib的實現(xiàn)方法,具有一定的參考價值,有興趣的可以了解一下
    2017-04-04
  • Java spring AOP基礎(chǔ)

    Java spring AOP基礎(chǔ)

    本篇文章主要介紹了深入理解spring的AOP機制基礎(chǔ)原理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-11-11

最新評論

晋州市| 建湖县| 仪征市| 江达县| 康平县| 莒南县| 稷山县| 东乡县| 无为县| 峡江县| 东乡县| 化隆| 宜兰县| 宁河县| 石河子市| 舞阳县| 盐山县| 安顺市| 修水县| 旅游| 水富县| 紫金县| 铁岭县| 永德县| 油尖旺区| 武鸣县| 黑水县| 五常市| 临桂县| 汨罗市| 高碑店市| 富源县| 高雄市| 普定县| 炎陵县| 丰顺县| 东安县| 丹江口市| 阜南县| 固镇县| 普兰店市|