摘要:指明了文件的位置,会使用这里制定的文件来验证配置的正确性。解析配置通过实现完成对自定义的文件的解析工作。到这整个扩展该进行的操作就都已经就绪了。
spring我们在开发过程中是个必不可少的框架,我们通常会将我们程序中的bean交由spring容器来进行管理,应用程序需要用到bean的时候从spring容器中去获取,spring是如何实现这种方式的呢?spring的配置文件,当我们在开发的过程中发现spring提供的配置命令不满足的情况下我们该怎么办呢?我们是不是要自己去解析原生的xml文件?当然不用spring为开发者提供了可扩展的schema的支持,可以支持自定义配置。
0x01 扩展配置步骤在classpath的META-INF下定义另个文件:spring.handlers、spring.schemas(识别配置)
自定义xsd文件(定义配置)
继承org.springframework.beans.factory.xml.NamespaceHandlerSupport、org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser(解析配置)
0x02 识别配置spring如何识别自定的schema文件
spring.handlers指明命名空间需要哪个类来处理。
spring.schemas指明了schema文件的位置,spring会使用这里制定的xsd文件来验证配置的正确性。
spring容器在启动的时候会根据这两个文件的配置加载文件内容,然后去解析文件中的配置信息。下面来看下具体的配置信息:
spring.handlers文件的配置内容:
</>复制代码
http://code.liutxer.com/schema/bymq=com.liutxer.by.conf.RpcNamespaceHandler
http://code.liutxer.com/schem...这个命名空间使用com.liutxer.by.conf.RpcNamespaceHandler这个类来处理。
spring.schemas文件的配置内容:
</>复制代码
http://code.liutxer.com/schema/bymq/rpc.xsd=META-INF/rpc.xsd
http://code.liutxer.com/schem...文件的位置在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());
}
}
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/66073.html
摘要:干货点了解如何基于自定义标签,这是自定义组件的第一步。这第一篇,记录基于如何自定义标签。所以,对于想扩展组件的小伙伴来说,了解如何自定义标签和相应的原理是必须走的第一步。到这一步,自定义标签的过程就全部理清楚了。 干货点 了解如何基于spring自定义标签,这是自定义组件的第一步。而最重要的是了解了这个过程后也可以大致了解spring自身部分组件是怎么相互工作和触发的,如spring-...
摘要:的依赖关系,根据依赖关系配置完成之间的装配。的行为信息,如生命周期范围及生命周期各过程的回调函数。使用该种装配模式时,优先匹配参数最多的构造函数。如果提供了默认的构造函数,则采用否则采用进行自动装配。 点击进入我的博客 1 Spring容器与Bean配置信息 Bean配置信息 Bean配置信息是Bean的元数据信息,它由一下4个方面组成: Bean的实现类 Bean的属性信息,如数...
摘要:版本不支持支持为,如果使用并且使用,则会出现提示,编译出错。扫描的仓库目录,会自动扫描扩展了接口的接口进行注入。 mongodb介绍 MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。 MongoD...
摘要:版本不支持支持为,如果使用并且使用,则会出现提示,编译出错。扫描的仓库目录,会自动扫描扩展了接口的接口进行注入。 mongodb介绍 MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。 MongoD...
摘要:前言对于程序员来说布局文件我们几乎每天都会写好几个而恰恰是很多每天都会用到的东西往往因为习惯了而忽略对其原理的探究对文件的认知反射配置文件定义格式疑问大家应该都有过这样的需求在代码中根据实时的数据通过代码动态控制而在使用的过程中就会明显的感 前言 对于 Android 程序员来说, 布局 XML 文件我们几乎每天都会写好几个, 而恰恰是很多每天都会用到的东西, 往往因为「习惯了」而忽略...
阅读 2591·2023-04-25 14:22
阅读 3907·2021-11-15 18:12
阅读 1440·2019-08-30 15:44
阅读 3371·2019-08-29 15:37
阅读 896·2019-08-29 13:49
阅读 3595·2019-08-26 12:11
阅读 1074·2019-08-23 18:28
阅读 1749·2019-08-23 14:55