博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
扩展spring schema文件
阅读量:6264 次
发布时间:2019-06-22

本文共 3838 字,大约阅读时间需要 12 分钟。

spring我们在开发过程中是个必不可少的框架,我们通常会将我们程序中的bean交由spring容器来进行管理,应用程序需要用到bean的时候从spring容器中去获取,spring是如何实现这种方式的呢?spring的配置文件,当我们在开发的过程中发现spring提供的配置命令不满足的情况下我们该怎么办呢?我们是不是要自己去解析原生的xml文件?当然不用spring为开发者提供了可扩展的schema的支持,可以支持自定义配置。

0x01 扩展配置步骤

  1. 在classpath的META-INF下定义另个文件:spring.handlers、spring.schemas(识别配置)

  2. 自定义xsd文件(定义配置)

  3. 继承org.springframework.beans.factory.xml.NamespaceHandlerSupport、org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser(解析配置)

0x02 识别配置

spring如何识别自定的schema文件

  1. spring.handlers指明命名空间需要哪个类来处理。

  2. spring.schemas指明了schema文件的位置,spring会使用这里制定的xsd文件来验证配置的正确性。

spring容器在启动的时候会根据这两个文件的配置加载文件内容,然后去解析文件中的配置信息。下面来看下具体的配置信息:

spring.handlers文件的配置内容:

http\://code.liutxer.com/schema/bymq=com.liutxer.by.conf.RpcNamespaceHandler

这个命名空间使用com.liutxer.by.conf.RpcNamespaceHandler这个类来处理。

spring.schemas文件的配置内容:

http\://code.liutxer.com/schema/bymq/rpc.xsd=META-INF/rpc.xsd

文件的位置在classpath:/META-INF/rpc.xsd中

0x03 定义配置

其中要注意的点主要有xmlns--xml namespace、targetNamespace这两个的定义。

0x04 解析配置

通过实现NamespaceHandlerSupport、BeanDefinitionParser完成对自定义的schema文件的解析工作。

NamespaceHandlerSupport会根据schema的节点名称来找到某个BeanDefinitionParser然后由BeanDefinitionParser来完成具体的解析工作,因此我们需要具体实现自己的NamespaceHandlerSupport和BeanDefinitionParser。下面看下具体实现:

public class RpcNamespaceHandler extends NamespaceHandlerSupport {    public void init() {        registerBeanDefinitionParser("service", new RpcBeanDefinitionParser(ServerBean.class));        registerBeanDefinitionParser("reference", new RpcBeanDefinitionParser(ReferenceBean.class));    }}

上面实例主要说明service这个自定义标签通过new RpcBeanDefinitionParser(ServerBean.class)通过这个parser进行解析。

public class RpcBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {    private Class
beanClass; public RpcBeanDefinitionParser(Class
beanClass) { this.beanClass = beanClass; } protected Class getBeanClass(Element element) { return this.beanClass; } protected void doParse(Element element, BeanDefinitionBuilder bean) { if (ServerBean.class.equals(this.beanClass)) { String interfaceVal = element.getAttribute("interface"); String refVal = element.getAttribute("ref"); Object reference = new RuntimeBeanReference(refVal); if (StringUtils.hasText(interfaceVal)) { bean.addPropertyValue("interfaceVal", interfaceVal); } if (reference != null) { bean.addPropertyValue("ref", reference); } } else if (ReferenceBean.class.equals(this.beanClass)) { String beanName = element.getAttribute("id"); String interfaceVal = element.getAttribute("interface"); if (StringUtils.hasText(interfaceVal)) { bean.addPropertyValue("interfaceVal", interfaceVal); } if (StringUtils.hasText(beanName)) { bean.addPropertyValue("beanName", beanName); } } }}

具体的BeanDefinitionParser实现解析操作,上面的实现比较简单就是将对应标签的属性值取出来然后构建出具体的bean。

到这整个扩展schema该进行的操作就都已经就绪了。

0x05 使用配置

spring配置文件:

这里通过spring的配置对扩展的schema定义配置,当spring容器加载的时候会加载、解析这份自定义的配置,实现扩展。

实例:

加载配置获得自定义的配置对象进行调用。

public class Test {        public static void main(String[] args) {        ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:app.xml");        IDemoTest demoTest = (IDemoTest) ctx.getBean("demoTest");        System.out.println("spring rpc test:" + demoTest.get());    }}

转载地址:http://bbcpa.baihongyu.com/

你可能感兴趣的文章
POJ-1925 Spiderman 动态规划
查看>>
实战BULK COLLECT(成批聚合类型)和数组集合type类型is table of 表%rowtype index by binary_integer ....
查看>>
Linux编程基础——线程概述
查看>>
Hive内部表外部表转化分析
查看>>
【转】使用Xcode和Instruments调试解决iOS内存泄露
查看>>
CDE: Automatically create portable Linux applications
查看>>
微信公众平台开发(4)天气预报
查看>>
WPF: RenderTransform特效
查看>>
基础才是重中之重~你是否真正了解TransactionScope?
查看>>
svn
查看>>
何时会发生db file sequential read等待事件?
查看>>
了解你所不知道的SMON功能(十二):Shrink UNDO(rollback) SEGMENT
查看>>
GCC编译器中的扩展
查看>>
[置顶] 礼物:《红孩儿引擎内功心法修练与Cocos2d-x》之结点系统(场景,层,精灵)...
查看>>
使用快捷键,快到极致
查看>>
[原]【实例化需求】1.FitNesse工具应用简介
查看>>
java中的import和package机制
查看>>
统计、案例-深入理解Oracle索引(10):索引列字符类型统计信息的32位限制-by小雨...
查看>>
ubuntu常用命令精选
查看>>
UML类图
查看>>