实战spring自定义属性(schema) 您所在的位置:网站首页 schema定义属性 实战spring自定义属性(schema)

实战spring自定义属性(schema)

#实战spring自定义属性(schema)| 来源: 网络整理| 查看: 265

在开发dubbo服务的时候,我们会在xml中做以下类似的配置:

spring启动后,dubbo的本地运行时环境就会获取到这些信息,根据这些信息完成注册服务,今天我们实战的内容就是开发一个类似的自定义属性,然后在spring项目中使用这个属性;

整个实战过程分为以下几步:

创建web工程; 创建配置属性的bean; 创建XSD文件; 创建自定义BeanDefinitionParser,制定配置信息的解析规则; 创建自定义NamespaceHandler,规定配置信息的解析器; 添加spring.handlers文件; 添加spring.schemas文件; 在工程中配置一个这样的属性; 启动web工程,验证配置;

本次实战对应的源码可以从我的git上下载,地址是:[email protected]:zq2599/blog_demos.git,里面有多个工程,本次用到的是springschemademo,如下图红框所示:

开始实战吧:

创建web工程

创建一个maven工程,pom.xml的内容如下,主要是把spring相关的依赖引入:

4.0.0 com.bolingcavalry springschemademo war 0.0.1-SNAPSHOT app Maven Webapp http://maven.apache.org 4.0.2.RELEASE junit junit 4.11 test org.springframework spring-core ${spring.version} org.springframework spring-web ${spring.version} org.springframework spring-oxm ${spring.version} org.springframework spring-tx ${spring.version} org.springframework spring-jdbc ${spring.version} org.springframework spring-webmvc ${spring.version} org.springframework spring-aop ${spring.version} org.springframework spring-context-support ${spring.version} org.springframework spring-test ${spring.version} org.springframework spring-beans ${spring.version} javax javaee-api 7.0 jstl jstl 1.2 org.codehaus.jackson jackson-mapper-asl 1.9.13 commons-fileupload commons-fileupload 1.3.1 commons-io commons-io 2.4 commons-codec commons-codec 1.9 ${project.artifactId} src/main/java **/*.properties **/*.xml false src/main/resources org.apache.tomcat.maven tomcat7-maven-plugin 2.2 http://localhost:8080/manager/text tomcat7 /${project.artifactId} true

web.xml中加上spring mvc的配置:

SpringMVC org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:spring-mvc.xml 1 true SpringMVC /

还有spring的配置文件,加上注解相关的配置:

其余的配置可以自行设置,或者参考我上传到git上的源码;

创建配置属性的bean

本次实战的示例,以"电脑"为例,有两个属性:操作系统和内存大小,如下:

package com.bolingcavalry; /** * Description: * * @author willzhao * @email [email protected] * @date 2017/7/1 22:15 */ public class Computer { /** * 操作系统 */ private String os; /** * 内存大小 */ private int ram; public String getOs() { return os; } public void setOs(String os) { this.os = os; } public int getRam() { return ram; } public void setRam(int ram) { this.ram = ram; } } 创建XSD文件

在工程的src\main\resources\META-INF\computer.xsd目录下创建computer.xsd文件,内容如下:

注意xmlns和targetNamespace的内容,在外部使用时也会用到,还有就是xsd:element节点,里面对computer的两个属性做了约束;

创建自定义BeanDefinitionParser,制定配置信息的解析规则

接下来要写个BeanDefinitionParser,作用是拿到xml中的computer节点后,该如何从这个节点中取得有效的信息给spring环境,源码如下:

public class ComputerBeanDefinitionParser extends AbstractSingleBeanDefinitionParser { @Override protected Class getBeanClass(Element element) { return Computer.class; } @Override protected void doParse(Element element, BeanDefinitionBuilder builder) { String os = element.getAttribute("os"); String ramStr = element.getAttribute("ram"); if(StringUtils.hasText(os)){ builder.addPropertyValue("os", os); } if(StringUtils.hasText(ramStr)){ builder.addPropertyValue("ram", Integer.valueOf(ramStr)); } } }

getBeanClass方法决定了解析节点后返回的bean的类型;doParse方法的入参中收到了computer节点,在方法中解析"os"和"ram"两个节点,然后调用builder.addPropertyValue可以把解析结果传入builder中;

创建自定义NamespaceHandler,规定配置信息的解析器

自定义的NamespaceHandler,可以告诉spring环境,遇到computer的配置信息后,应该用ComputerBeanDefinitionParser去解析,代码很少,如下:

public class ComputerNamespaceHandler extends NamespaceHandlerSupport { public void init() { registerBeanDefinitionParser("computer", new ComputerBeanDefinitionParser()); } } 添加spring.handlers文件

在src\main\resources\META-INF\目录下,添加spring.handlers文件,内容只有一行,如下:

http\://blog.csdn.net/boling_cavalry/schema/computer=com.bolingcavalry.ComputerNamespaceHandler 添加spring.schemas文件

在src\main\resources\META-INF\目录下,添加spring.schemas文件,内容只有一行,如下:

http\://blog.csdn.net/boling_cavalry/schema/computer.xsd=META-INF/computer.xsd 在工程中配置一个这样的属性

准备得差不多了,可以验证一下啦,在spring的配置文件中,如果要用到这个属性,可以按照如下方式来写:

除了bolingcavalry:computer的配置,还要注意xmlns:bolingcavalry的配置,还有xsi:schemaLocation中“http://blog.csdn.net/bolingcavalry/schema/computer"和 "http://blog.csdn.net/bolingcavalry/schema/computer.xsd”也不要遗漏。

启动web工程,验证配置

为了验证配置是生效的,我们写一个controller在浏览器中显示配置信息,代码如下:

@Controller public class HelloController { private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @Autowired Computer computer; @RequestMapping("/hello") @ResponseBody public String toIndex(HttpServletRequest request, Model model) { return "hello 001 [" + sdf.format(new Date()) + "], computer os [" + computer.getOs() + "], ram [" + computer.getRam() + "]"; } }

computer提供autowire注入,在web响应的时候会输出它的两个属性,现在启动tomcat并部署这个webapp,在浏览器中输入http://localhost:8080/springschemademo/hello,就能看到如下输出:

以上就是spring自定义schema的实战内容,希望您在开发自定义schema时本文能给您一些参考。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有