spring怎么自定义属性-成都快上网建站

spring怎么自定义属性

本篇内容介绍了“spring怎么自定义属性”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

创新互联是一家专业提供浑源企业网站建设,专注与成都网站制作、网站设计、外贸网站建设H5高端网站建设、小程序制作等业务。10年已为浑源众多企业、政府机构等服务。创新互联专业网站制作公司优惠进行中。

关于spring自定义属性(schema)

在开发Dubbo应用的时候,我们会在xml中做以下类似的配置:



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

全文概览

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

  1. 创建web工程;

  2. 创建配置属性的bean;

  3. 创建XSD文件;

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

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

  6. 添加spring.handlers文件;

  7. 添加spring.schemas文件;

  8. 在工程中配置一个这样的属性;

  9. 启动web工程,验证配置;

源码下载

如果您不打算编码,也可以在GitHub下载本次实战的源码,地址是:https://github.com/zq2599/blog_demos ,里面有多个工程,本次用到的是springschemademo,如下图红框所示:

spring怎么自定义属性

接下来开始实战:

创建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 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文件

在工程的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/boling_cavalry/schema/computer"和 "http://blog.csdn.net/boling_cavalry/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怎么自定义属性

“spring怎么自定义属性”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!


文章标题:spring怎么自定义属性
网址分享:http://kswjz.com/article/jossog.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流