dubbo源碼學習(二) : spring 自訂標籤

來源:互聯網
上載者:User

標籤:java   dubbo   spring   自訂標籤   

做dubbo的配置時很容易發現,dubbo有一套自己的標籤,提供給開發人員配置,其實每一個標籤對應著一個 實體,在容器啟動的時候,dubbo會對所有的配置進行解析然後將解析後的內容設定到實體裡,最終dubbo會根據實體中的值產生貫穿全域的統一URL。利用自訂標籤使配置簡單明了化,與spring完美融合。
下面自己寫一個自訂標籤,主要需要如下 幾個步驟:

1、編寫實體類
2、編寫Parser解析類
3、編寫NameSpaceHandle類
4、配置spring.handlers
5、配置spring.schemas
6、配置customTag .xsd

標籤實體類如下:

public class CustomTag {private String id;private String name;private Integer age;private String profession;private String address;private String phone;public String getId() {    return id;}public void setId(String id) {    this.id = id;}public String getName() {    return name;}public void setName(String name) {    this.name = name;}public Integer getAge() {    return age;}public void setAge(Integer age) {    this.age = age;}public String getProfession() {    return profession;}public void setProfession(String profession) {    this.profession = profession;}public String getAddress() {    return address;}public void setAddress(String address) {    this.address = address;}public String getPhone() {    return phone;}public void setPhone(String phone) {    this.phone = phone;}public String toString(){    StringBuffer sb = new StringBuffer();    sb.append(id + "\n");    sb.append(name + "\n");    sb.append(age + "\n");    sb.append(profession + "\n");    sb.append(address + "\n");    sb.append(phone + "\n");    return sb.toString();}

}

標籤的解析類如下:

    public class CustomTagBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {        private final Class<?> beanClass;        private final boolean required;        public CustomTagBeanDefinitionParser (Class<?> beanClass, boolean required) {                this.beanClass = beanClass;                this.required = required;        }        protected Class getBeanClass(Element element) {                return CustomTag.class;        }        protected void doParse(Element element, BeanDefinitionBuilder builder) {                //通過設定檔擷取相應的值,設定到bean的屬性中                String id = element.getAttribute("id");                String name = element.getAttribute("name");                String age = element.getAttribute("age");                String profession = element.getAttribute("profession");                String address = element.getAttribute("address");                String phone = element.getAttribute("phone");                if (StringUtils.hasText(id)) {                        builder.addPropertyValue("id", id);                }                if (StringUtils.hasText(name)) {                        builder.addPropertyValue("name", name);                }                if (StringUtils.hasText(age)) {                        builder.addPropertyValue("age", age);                }                if (StringUtils.hasText(profession)) {                        builder.addPropertyValue("profession", profession);                }                if (StringUtils.hasText(address)) {                        builder.addPropertyValue("address", address);                }                if (StringUtils.hasText(phone)) {                        builder.addPropertyValue("phone", phone);                }        }}

NameSpaceHandle類如下:

public class CustomTagNamespaceHandler extends NamespaceHandlerSupport {        @Override        public void init() {                //實現init方法,解析CustomTag標籤                registerBeanDefinitionParser("customTag",new CustomTagBeanDefinitionParser(CustomTag.class,true));        }}

spring.handlers配置,前面那一串其實可以隨便配置,只要一會和後面的配置一致即可

http\://www.51gitee.net/schema/customTag=springNameSpace.CustomTagNamespaceHandler

spring.schemas配置

http\://www.51gitee.net/schema/customTag/customTag.xsd=META-INF/customTag.xsd

customTag.xsd的配置

<?xml version="1.0" encoding="UTF-8"?><xsd:schema                xmlns="http://www.51gitee.net/schema/customTag"                xmlns:xsd="http://www.w3.org/2001/XMLSchema"                xmlns:beans="http://www.springframework.org/schema/beans"                targetNamespace="http://www.51gitee.net/schema/customTag"                elementFormDefault="qualified"                attributeFormDefault="unqualified">        <xsd:import namespace="http://www.springframework.org/schema/beans" />        <!-- 定義element名, customTagType對應了bean的屬性  -->        <xsd:element name="customTag" type="customTagType">                <xsd:annotation>                        <xsd:documentation><![CDATA[ The customTag config ]]></xsd:documentation>                </xsd:annotation>        </xsd:element>        <!--  配置各屬性值,有點像Mybatis配置對應的model   -->        <xsd:complexType name="customTagType">                <xsd:attribute name="id" type="xsd:ID">                        <xsd:annotation>                                <xsd:documentation><![CDATA[ The unique identifier for a bean. ]]></xsd:documentation>                        </xsd:annotation>                </xsd:attribute>                <xsd:attribute name="name" type="xsd:string" use="required">                        <xsd:annotation>                                <xsd:documentation><![CDATA[ The customTag name. ]]></xsd:documentation>                        </xsd:annotation>                </xsd:attribute>                <xsd:attribute name="age" type="xsd:int">                        <xsd:annotation>                                <xsd:documentation><![CDATA[ The customTag age. ]]></xsd:documentation>                        </xsd:annotation>                </xsd:attribute>                <xsd:attribute name="profession" type="xsd:string">                        <xsd:annotation>                                <xsd:documentation><![CDATA[ The customTag profession. ]]></xsd:documentation>                        </xsd:annotation>                </xsd:attribute>                <xsd:attribute name="address" type="xsd:string">                        <xsd:annotation>                                <xsd:documentation><![CDATA[ The customTag address. ]]></xsd:documentation>                        </xsd:annotation>                </xsd:attribute>                <xsd:attribute name="phone" type="xsd:string">                        <xsd:annotation>                                <xsd:documentation><![CDATA[ The customTag phone. ]]></xsd:documentation>                        </xsd:annotation>                </xsd:attribute>        </xsd:complexType></xsd:schema>

最後測試
在建立一個spring的設定檔如下

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"             xmlns:common="http://www.51gitee.net/schema/customTag"             xsi:schemaLocation="         http://www.springframework.org/schema/beans         http://www.springframework.org/schema/beans/spring-beans-3.2.xsd         http://www.oschina.net/schema/customTag         http://www.oschina.net/schema/customTag/customTag.xsd">        <common:customTag id="test"  name="chewenliang" address="bei jing" age="12" phone="18618152379" profession="技術" /></beans>

在java代碼中測試

public class TestNameSpace {        public static void main(String[] args) {                ApplicationContext context = new ClassPathXmlApplicationContext("spring-test.xml");                CustomTag customTag= (CustomTag) context.getBean("test");                System.out.println(customTag.toString());        }}

輸出結果:

  test  chewenliang  12  技術  bei jing  18618152379  

spring的自訂標籤自己很容易實現,具體要看在實際項目中如何正確的實用它,接下來會記錄dubbo是如何解析、暴露服務。

關注我可以擷取it視頻

dubbo源碼學習(二) : spring 自訂標籤

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.