频道栏目
首页 > 程序开发 > 软件开发 > 其他 > 正文
自定义dubbo的spring标签实现
2017-11-15 11:40:12         来源:吉他程序员的博客  
收藏   我要投稿

1.今天来介绍下的实现。注意是没有配置id的哦

2.定义标签bean类

public class Service {
    private String ref;

    private String inter;

    private String version;

    private String timeout;

    private String id ;

    public String getVersion() {
        return version;
    }
    /////省略getter,setter

3.定义ServiceNameSpaceHandler类,指定解析器

public class ServiceNameSpaceHandler  extends NamespaceHandlerSupport{

    public void init() {
        // 注册用于解析的解析器
        registerBeanDefinitionParser("service", new ServiceParser(Service.class));
    }
}

4.ServiceParser标签解析器

public class ServiceParser implements BeanDefinitionParser {
    // 标签对应在spring中的 bean的calss
    private Class beanClass ;

    public ServiceParser(Class beanClass) {
        this.beanClass = beanClass ;
    }
    public BeanDefinition parse(Element element, ParserContext parserContext) {
        //构造spring bean
        RootBeanDefinition beanDefinition = new RootBeanDefinition();
        // 设置bean class , 类型就是 Service.class
        beanDefinition.setBeanClass(beanClass);
        // 懒加载
        beanDefinition.setLazyInit(false);
         // 解析xml标签对应的值
        String id = element.getAttribute("id");
        String ref = element.getAttribute("ref");
        String inter = element.getAttribute("interface");
        String version = element.getAttribute("version");
        String timeout = element.getAttribute("timeout");
         //这里id肯定为空。因为不能配置id , 为了能引用到就把id值就等于ref值
        if(StringUtils.isEmpty(id)){ // 指向 ref
            id = ref ;
        }
        // 向spring注册这个bean , 
     parserContext.getRegistry().registerBeanDefinition(id, beanDefinition);
        // 向 bean注入 id属性值
        beanDefinition.getPropertyValues().addPropertyValue("id", id);
        if (StringUtils.hasText(inter)) {
            // 向 bean注入 inter属性值
            beanDefinition.getPropertyValues().addPropertyValue("inter", inter);
        }
        if (StringUtils.hasText(version)) {
            // 向 bean注入 version属性值
            beanDefinition.getPropertyValues().addPropertyValue("version", version);
        }
        if (StringUtils.hasText(timeout)) {
            // 向 bean注入 timeout属性值
            beanDefinition.getPropertyValues().addPropertyValue("timeout", timeout);
        }
        return beanDefinition;
    }
}

5.dubbo.xsdxml约束文件编写, 放在META-INF目录下,这里就是标签的约束,这个定义我就不讲了,搜w3c

  
    
        
            
                
            
        
        
            
                
            
        
        
            
                
            
        
        
            
                
                
                    
                        
                    
                
            
        
        
            
                
            
        
    
   

6.spring.handlers 文件 必须在META-INF 下 , 定义上面ServiceNameSpaceHandler的位置,这样spring就能找到解析处理器ServiceNameSpaceHandler,根据解析处理来找到具体解析器了。

http\://www.luo.com/schema/dubbo=com.luo.spring.ServiceNameSpaceHandler

7.spring.schemas 文件 必须在META-INF 下 , 指定标签引用路径,下面表示当spring配置文件指定https://www.luo.com/schema/dubbo/dubbo.xsd路径时就找META-INF/dubbo.xsd这个xsd文件

http\://www.luo.com/schema/dubbo/dubbo.xsd=META-INF/dubbo.xsd

8.可以测试了

spring.xml spring配置文件 , 这里标签约束路径https://www.luo.com/schema/dubbo就是上面spring.schemas的指定路径


    
 

// main测试
 public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");  
        Service p = (Service)ctx.getBean("a");
        System.out.println(p);  
    }

//打印
Service [ref=a, inter=com.a.b.service, version=27, timeout=0]
点击复制链接 与好友分享!回本站首页
上一篇:SPOJ 287 Smart Network Administrator 二分+网络最大流“编程题”
下一篇:彻底搞定最大匹配数最优匹配
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站