关于spring自定义属性(schema)
在开发Dubbo应用的时候,我们会在xml中做以下类似的配置:
spring启动后,Dubbo的本地运行时环境就会获取到这些信息,根据这些信息完成注册服务,今天我们实战的内容就是开发一个类似的自定义属性,然后在spring项目中使用这个属性;
全文概览
整个实战过程分为以下几步:
- 创建web工程;
- 创建配置属性的bean;
- 创建XSD文件;
- 创建自定义BeanDefinitionParser,制定配置信息的解析规则;
- 创建自定义NamespaceHandler,规定配置信息的解析器;
- 添加spring.handlers文件;
- 添加spring.schemas文件;
- 在工程中配置一个这样的属性;
- 启动web工程,验证配置;
源码下载
如果您不打算编码,也可以在GitHub下载本次实战的源码,地址是:https://github.com/zq2599/blog_demos ,里面有多个工程,本次用到的是springschemademo,如下图红框所示:
接下来开始实战:
创建web工程
创建一个maven工程,pom.xml的内容如下,主要是把spring相关的依赖引入:
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
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的配置文件,加上注解相关的配置:
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
其余的配置可以自行设置,或者参考我上传到git上的源码;
创建配置属性的bean
本次实战的示例,以"电脑"为例,有两个属性:操作系统和内存大小,如下:
package com.bolingcavalry;
/**
* Description:
*
* @author willzhao
* @email zq2599@gmail.com
* @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文件
在工程的srcmainresourcesMETA-INFcomputer.xsd目录下创建computer.xsd文件,内容如下:
xmlns="http://blog.csdn.net/boling_cavalry/schema/computer"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:beans="http://www.springframework.org/schema/beans"
targetNamespace="http://blog.csdn.net/boling_cavalry/schema/computer"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
注意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