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

Spring的自定義擴(kuò)展標(biāo)簽NamespaceHandler解析

 更新時間:2023年12月01日 11:11:12   作者:nuomizhende45  
這篇文章主要介紹了Spring的自定義擴(kuò)展標(biāo)簽NamespaceHandler解析,在很多情況下,我們需要為系統(tǒng)提供可配置化支持,簡單的做法可以直接基于Spring的標(biāo)準(zhǔn)Bean來配置,Spring提供了可擴(kuò)展Schema的支持,這是一個不錯的折中方案,需要的朋友可以參考下

自定義擴(kuò)展標(biāo)簽NamespaceHandler

在很多情況下,我們需要為系統(tǒng)提供可配置化支持,簡單的做法可以直接基于Spring的標(biāo)準(zhǔn)Bean來配置,但配置較為復(fù)雜或者需要更多豐富控制的時候,會顯得非常笨拙。一般的做法會用原生態(tài)的方式去解析定義好的xml文件,然后轉(zhuǎn)化為配置對象,這種方式當(dāng)然可以解決所有問題,但實現(xiàn)起來比較繁瑣,特別是是在配置非常復(fù)雜的時候,解析工作是一個不得不考慮的負(fù)擔(dān)。Spring提供了可擴(kuò)展Schema的支持,這是一個不錯的折中方案,完成一個自定義

配置一般需要以下步驟:

[1] 設(shè)計配置屬性和JavaBean

[2] 編寫XSD文件

[3] 編寫NamespaceHandler和BeanDefinitionParser完成解析工作

[4] 編寫spring.handlers和spring.schemas串聯(lián)起所有部件

[5] 在Bean文件中應(yīng)用 下面結(jié)合一個小例子來實戰(zhàn)以上過程

1)設(shè)計配置屬性和JavaBean

首先當(dāng)然得設(shè)計好配置項,并通過JavaBean來建模,本例中需要配置People實體,配置屬性name和age(id是默認(rèn)需要的)

public class People {  
    private String id;  
    private String name;  
    private Integer age;  
}  

2)編寫XSD文件

為上一步設(shè)計好的配置項編寫XSD文件,XSD是schema的定義文件,配置的輸入和解析輸出都是以XSD為契約,本例中XSD如下:

<?xml version="1.0" encoding="UTF-8"?>  
<xsd:schema   
    xmlns="http://blog.csdn.net/cutesource/schema/people"  
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"   
    xmlns:beans="http://www.springframework.org/schema/beans"  
    targetNamespace="http://blog.csdn.net/cutesource/schema/people"  
    elementFormDefault="qualified"   
    attributeFormDefault="unqualified">  
    <xsd:import namespace="http://www.springframework.org/schema/beans" />  
    <xsd:element name="people">  
        <xsd:complexType>  
            <xsd:complexContent>  
                <xsd:extension base="beans:identifiedType">  
                    <xsd:attribute name="name" type="xsd:string" />  
                    <xsd:attribute name="age" type="xsd:int" />  
                </xsd:extension>  
            </xsd:complexContent>  
        </xsd:complexType>  
    </xsd:element>  
</xsd:schema> 

關(guān)于xsd:schema的各個屬性具體含義就不作過多解釋,可以參見//www.w3school.com.cn/schema/schema_schema.asp

<xsd:element name=“people”>對應(yīng)著配置項節(jié)點的名稱,因此在應(yīng)用中會用people作為節(jié)點名來引用這個配置

<xsd:attribute name=“name” type=“xsd:string” />和<xsd:attribute name=“age” type=“xsd:int” />對應(yīng)著配置項people的兩個屬性名,因此在應(yīng)用中可以配置name和age兩個屬性,分別是string和int類型

完成后需把xsd存放在classpath下,一般都放在META-INF目錄下(本例就放在這個目錄下)

3)編寫NamespaceHandler和BeanDefinitionParser完成解析工作

下面需要完成解析工作,會用到NamespaceHandler和BeanDefinitionParser這兩個概念。具體說來 NamespaceHandler會根據(jù)schema和節(jié)點名找到某個BeanDefinitionParser,然后由 BeanDefinitionParser完成具體的解析工作。因此需要分別完成NamespaceHandler和 BeanDefinitionParser的實現(xiàn)類,Spring提供了默認(rèn)實現(xiàn)類NamespaceHandlerSupport和 AbstractSingleBeanDefinitionParser,簡單的方式就是去繼承這兩個類。本例就是采取這種方式:

import org.springframework.beans.factory.xml.NamespaceHandlerSupport;  
public class MyNamespaceHandler extends NamespaceHandlerSupport {  
    public void init() {  
        registerBeanDefinitionParser("people", new PeopleBeanDefinitionParser());  
    }  
}  

其中registerBeanDefinitionParser(“people”, new PeopleBeanDefinitionParser());就是用來把節(jié)點名和解析類聯(lián)系起來,在配置中引用people配置項時,就會用 PeopleBeanDefinitionParser來解析配置。PeopleBeanDefinitionParser就是本例中的解析類:

import org.springframework.beans.factory.support.BeanDefinitionBuilder;  
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;  
import org.springframework.util.StringUtils;  
import org.w3c.dom.Element;  
public class PeopleBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {  
    protected Class getBeanClass(Element element) {  
        return People.class;  
    }  
    protected void doParse(Element element, BeanDefinitionBuilder bean) {  
        String name = element.getAttribute("name");  
        String age = element.getAttribute("age");  
        String id = element.getAttribute("id");  
        if (StringUtils.hasText(id)) {  
            bean.addPropertyValue("id", id);  
        }  
        if (StringUtils.hasText(name)) {  
            bean.addPropertyValue("name", name);  
        }  
        if (StringUtils.hasText(age)) {  
            bean.addPropertyValue("age", Integer.valueOf(age));  
        }  
    }  
}  

其中element.getAttribute就是用配置中取得屬性值,bean.addPropertyValue就是把屬性值放到bean中。

4)編寫spring.handlers和spring.schemas串聯(lián)起所有部件

上面幾個步驟走下來會發(fā)現(xiàn)開發(fā)好的handler與xsd還沒法讓應(yīng)用感知到,就這樣放上去是沒法把前面做的工作納入體系中的,spring提供了 spring.handlers和spring.schemas這兩個配置文件來完成這項工作,這兩個文件需要我們自己編寫并放入META-INF文件夾 中,這兩個文件的地址必須是META-INF/spring.handlers和META-INF/spring.schemas,spring會默認(rèn)去 載入它們,本例中spring.handlers如下所示:

//blog.csdn.net/cutesource/schema/people=study.schemaExt.MyNamespaceHandler 以上表示當(dāng)使用到名為"//blog.csdn.net/cutesource/schema/people"的schema引用時,會通過study.schemaExt.MyNamespaceHandler來完成解析

spring.schemas如下所示:

//blog.csdn.net/cutesource/schema/people.xsd=META-INF/people.xsd 以上就是載入xsd文件

5)在Bean文件中應(yīng)用

到此為止一個簡單的自定義配置以完成,可以在具體應(yīng)用中使用了。使用方法很簡單,和配置一個普通的spring bean類似,只不過需要基于我們自定義schema,本例中引用方式如下所示:

<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
    xmlns:cutesource="http://blog.csdn.net/cutesource/schema/people"  
    xsi:schemaLocation="  
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
http://blog.csdn.net/cutesource/schema/people http://blog.csdn.net/cutesource/schema/people.xsd">  
    <cutesource:people id="test" name="test" age="1"/>  
</beans> 

其中xmlns:cutesource=“//blog.csdn.net/cutesource/schema/people” 是用來指定自定義schema,xsi:schemaLocation用來指定xsd文件。<cutesource:people id=“cutesource” name=“zhijun.yuanzj” age=“27”/>是一個具體的自定義配置使用實例。

最后就可以在具體程序中使用基本的bean載入方式來載入我們的自定義配置對象了,如:

ApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml");  
People p = (People)ctx.getBean("cutesource");  
System.out.println(p.getId());  
System.out.println(p.getName());  
System.out.println(p.getAge());   

會輸出:

test test 1

到此這篇關(guān)于Spring的自定義擴(kuò)展標(biāo)簽NamespaceHandler解析的文章就介紹到這了,更多相關(guān)自定義擴(kuò)展標(biāo)簽NamespaceHandler內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java如何實現(xiàn)通過證書訪問Https請求

    Java如何實現(xiàn)通過證書訪問Https請求

    這篇文章主要介紹了Java如何實現(xiàn)通過證書訪問Https請求,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • java -length的三種用法說明

    java -length的三種用法說明

    這篇文章主要介紹了java -length的三種用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • java實現(xiàn)貪吃蛇游戲代碼(附完整源碼)

    java實現(xiàn)貪吃蛇游戲代碼(附完整源碼)

    這篇文章主要介紹了java實現(xiàn)貪吃蛇游戲代碼(附完整源碼),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • 使用?EasyCode生成springboot+mybatis基礎(chǔ)程序的實現(xiàn)示例

    使用?EasyCode生成springboot+mybatis基礎(chǔ)程序的實現(xiàn)示例

    本文主要介紹了使用?EasyCode生成springboot+mybatis基礎(chǔ)程序的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Java中ArrayList初始化的四種方法詳解

    Java中ArrayList初始化的四種方法詳解

    這篇文章主要介紹了Java中ArrayList初始化的四種方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • MyBatis的動態(tài)攔截sql并修改

    MyBatis的動態(tài)攔截sql并修改

    因工作需求,需要根據(jù)用戶的數(shù)據(jù)權(quán)限,來查詢并展示相應(yīng)的數(shù)據(jù),那么就需要動態(tài)攔截sql,本文就來介紹了MyBatis的動態(tài)攔截sql并修改,感興趣的可以了解一下
    2023-11-11
  • java實現(xiàn)文件夾解壓和壓縮

    java實現(xiàn)文件夾解壓和壓縮

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)文件夾解壓和壓縮,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • 詳解Java在redis中進(jìn)行對象的緩存

    詳解Java在redis中進(jìn)行對象的緩存

    這篇文章主要介紹了Java在redis中進(jìn)行對象的緩存,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • JAVA List和Map切割工具詳解

    JAVA List和Map切割工具詳解

    這篇文章主要介紹了JAVA List和Map切割工具詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Spring?Boot?配置?Hikari?數(shù)據(jù)庫連接池的操作代碼

    Spring?Boot?配置?Hikari?數(shù)據(jù)庫連接池的操作代碼

    數(shù)據(jù)庫連接池是一個提高程序與數(shù)據(jù)庫的連接的優(yōu)化,連接池它主要作用是提高性能、節(jié)省資源、控制連接數(shù)、連接管理等操作,這篇文章主要介紹了SpringBoot配置Hikari數(shù)據(jù)庫連接池,需要的朋友可以參考下
    2023-09-09

最新評論

菏泽市| 越西县| 绥江县| 增城市| 莱芜市| 汉阴县| 乡宁县| 郑州市| 延寿县| 东宁县| 宣城市| 顺昌县| 石门县| 江陵县| 夏津县| 吉水县| 桂阳县| 宜阳县| 靖安县| 图木舒克市| 两当县| 江川县| 化州市| 嵊泗县| 盱眙县| 吉木萨尔县| 咸宁市| 淮南市| 韶关市| 渭南市| 邹城市| 玉溪市| 阜新| 万宁市| 石柱| 南溪县| 项城市| 屏东县| 孟州市| 益阳市| 湘乡市|