zoukankan      html  css  js  c++  java
  • Dubbo学习摘录(一)

    Dubbo基于自定义配置,实现自己的Bean。
    通常,完成一个自定义配置需要以下步骤:

    • 设计配置属性和JavaBean;
    • 编写XSD文件;
    • 编写NamespaceHandler和BeanDefinitionParser完成解析工作;
    • 编写spring.handlers和spring.schemas串联起所有部件;
    • 在Bean文件中应用。

    下面是一个小Demo,
    (1)设计配置属性和JavaBean
    首先当然得设计好配置项,并通过 JavaBean 来建模,本例中需要配置 People 实体,配
    置属性 name 和 age(id 是默认需要的)

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

    (2)编写 XSD 文件
    为上一步设计好的配置项编写 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>
    

    xsd:schema 的各个属性具体含义参考 http://www.w3school.com.cn/schema/schema_schema.asp

    <xsd:element name="people">对应着配置项节点的名称,因此在应用中会用 people 作为 节点名来引用这个配置
    <xsd:attribute name="name" type="xsd:string" /> 和 <xsd:attribute name="age" type="xsd:int" />对应着配置项people的两个属性名,因此在应用中可以配置name和 age 两个属性,分别是 string 和 int 类型
    完成后需把 xsd 存放在 classpath 下,一般都放在 META-INF 目录下(本例就放在这个目录下)。

    (3)编写 NamespaceHandler 和 BeanDefinitionParser 完成解析工作
    下面需要完成解析工作,会用到 NamespaceHandler 和 BeanDefinitionParser 这两个概念。
    具体说来 NamespaceHandler 会根据 schema 和节点名找到某个 BeanDefinitionParser,然后由 BeanDefinitionParser 完成具体的解析工作。因此需要分别完成 NamespaceHandler 和 BeanDefinitionParser 的实现类,Spring 供了默认实现类 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());就是用来 把节点名和解析类联系起来,在配置中引用 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));
            }
        }
    }
    

    (4)编写 spring.handlers 和 spring.schemas 串联起所有部件
    上面几个步骤走下来会发现开发好的 handler 与 xsd 还没法让应用感知到,就这样放上去是没法把前面做的工作纳入体系中的,spring 供了 spring.handlers 和 spring.schemas 这 两个配置文件来完成这项工作,这两个文件需要我们自己编写并放入 META-INF 文件夹中, 这两个文件的地址必须是 META-INF/spring.handlers 和 META-INF/spring.schemas,spring 会默 认去载入它们。
    本例中 spring.handlers 如下所示:

    http://blog.csdn.net/cutesource/schema/people=study.schemaExt.MyNamespaceHandler

    以上表示当使用到名为"http://blog.csdn.net/cutesource/schema/people"的 schema 引用时, 会通过 study.schemaExt.MyNamespaceHandler 来完成解析
    spring.schemas 如下所示:

    http://blog.csdn.net/cutesource/schema/people.xsd=META-INF/people.xsd

    以上就是载入 xsd 文件。
    (5)在 Bean 文件中应用
    到此为止一个简单的自定义配置以完成,可以在具体应用中使用了。使用方法很简单, 和配置一个普通的 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.x sd
    http://blog.csdn.net/cutesource/schema/people http://blog.csdn.net/cutesource/schema/people.xsd">
        <cutesource:people id="cutesource" name="袁志俊" age="27"/>
    </beans>
    

    其中 xmlns:cutesource="http://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());
    

    会输出:

    cutesource
    袁志俊
    27

    以上就是一个基于 Spring 可扩展 Schema 供自定义配置支持实战过程,一些复杂应用 和技巧还有待挖掘。

  • 相关阅读:
    nginx申请并配置免费https
    linux安装git
    linux安装openssl
    nginx配置支持http2
    linux服务器升级nginx
    linux 增加虚拟内存swap(使用文件)
    使用shell安装lnmp
    mysql 数据库主从同步
    Android四大组件之Service
    Android四大组件之Activity
  • 原文地址:https://www.cnblogs.com/jenkov/p/dubbo_learning_001.html
Copyright © 2011-2022 走看看