`

基于Spring可扩展Schema提供自定义配置支持

 
阅读更多

在很多情况下,我们需要为系统提供可配置化支持,简单的做法可以直接基于Spring的标准Bean来配置,但配置较为复杂或者需要更多丰富控制的时候,会显得非常笨拙。整平机一般的做法会用原生态的方式往解析定义好的xml文件,然后转化为配置对象,这种方式当然可以解决所有题目,但实现起来比较繁琐,特别是是在配置非常复杂的时候,解析工作是一个不得不考虑的负担。整平机Spring提供了可扩展Schema的支持,这是一个不错的折衷方案,完成一个自定义配置一般需要以下步骤: 设计配置属性和JavaBean 

  编写XSD文件 
  编写NamespaceHandler和BeanDefinitionParser完成解析工作 
  编写spring.handlers和spring.schemas串联起所有部件 

  在Bean文件中应用 


下面结合一个小例子来实战以上过程 


  1)设计配置属性和JavaBean 
  首先当然得设计好配置项,并通过JavaBean来建模,本例中需要配置People实体,配置属性name和age(id是默认需要的) publicclassPeople{ 
  privateStringid; 
  privateStringname; 
  privateIntegerage; 
  } 

  2)编写XSD文件 
  为上一步设计好的配置项编写XSD文件,XSD是schema的定义文件,配置的输进和解析输出都是以XSD为契约,本例中XSD如下: <?xmlversion="1.0"encoding="UTF-8"?> 
  <xsd:schema 
  xmlns="http://blog.csdn.net/cutesource/schema/people" 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  xmlns:beans="http://www.springframework.org/schema/beans" 
  targetNamespace="http://blog.csdn.net/cutesource/schema/people" 
  elementFormDefault="qualified" 
  attributeFormDefault="unqualified"
  <xsd:importnamespace="http://www.springframework.org/schema/beans"/> 
  <xsd:elementname="people"
  <xsd:complexType
  <xsd:complexContent
  <xsd:extensionbase="beans:identifiedType"
  <xsd:attributename="name"type="xsd:string"/> 
  <xsd:attributename="age"type="xsd:int"/> 
  </xsd:extension
  </xsd:complexContent
  </xsd:complexType
  </xsd:element
  </xsd:schema
  关于xsd:schema的各个属性具体含义就不作过多解释,可以参见http://www.w3school.com.cn/schema/schema_schema.as p 

  <xsd:element name="people">对应着配置项节点的名称,因此在应用中会用people作为节点名来引用这个配置 
  <xsd:attribute name="name" type="xsd:string" />和<xsd:attribute name="age" type="xsd:int" />对应着配置项people的两个属性名,因此在应用中可以配置name和age两个属性,分别是string和int类型 
  完成后需把xsd存放在classpath下,一般都放在META-INF目录下(本例就放在这个目录下) 
  

      3)编写NamespaceHandler和BeanDefinitionParser完成解析工作 
  下面需要完成解析工作,会用到NamespaceHandler和BeanDefinitionParser这两个概念。具体说来NamespaceHandler会根据schema和节点名找到某个BeanDefinitionParser,然后由BeanDefinitionParser完成具体的解析工作。因此需要分别完成NamespaceHandler和BeanDefinitionParser的实现类,Spring提供了默认实现类NamespaceHandlerSupport和AbstractSingleBeanDefinitionParser,简单的方式就是往继续这两个类。本例就是采取这种方式:importorg.springframework.beans.factory.xml.NamespaceHan dlerSupport; 
  publicclassMyNamespaceHandlerextendsNamespaceHandlerSupport{ 
  publicvoidinit(){ 
  registerBeanDefinitionParser("people",newPeopleBeanDefinitionParser()); 
  } } 

  其中registerBeanDefinitionParser("people", new PeopleBeanDefinitionParser());就是用来把节点名和解析类联系起来,在配置中引用people配置项时,就会用PeopleBeanDefinitionParser来解析配置。PeopleBeanDefinitionParser就是本例中的解析类:importorg.springframework.beans.factory.support.BeanDefi nitionBuilder; 
  importorg.springframework.beans.factory.xml.AbstractSing leBeanDefinitionParser; 
  importorg.springframework.util.StringUtils; 
  importorg.w3c.dom.Element; 
  publicclassPeopleBeanDefinitionParserextendsAbstractSingleBeanDefinitionParser{ 
  protectedClassgetBeanClass(Elementelement){ 
  returnPeople.class; } 
  protectedvoiddoParse(Elementelement,BeanDefinitionBuilderbean){ 
  Stringname=element.getAttribute("name"); 
  Stringage=element.getAttribute("age"); 
  Stringid=element.getAttribute("id"); 
  if(StringUtils.hasText(id)){ 
  bean.addPropertyValue("id",id); } 
  if(StringUtils.hasText(name)){ 
  bean.addPropertyValue("name",name); } 
  if(StringUtils.hasText(age)){ 
  bean.addPropertyValue("age",Integer.valueOf(age)); 
  } } } 

  其中element.getAttribute就是用配置中取得属性值,bean.addPropertyValue就是把属性值放到bean中。 

  4)编写spring.handlersspring.schemas串联起所有部件 
  上面几个步骤走下来会发现开发好的handler与xsd还没法让应用感知到,就这样放上往是没法把前面做的工作纳进体系中的,spring提供了spring.handlers和spring.schemas这两个配置文件来完成这项工作,这两个文件需要我们自己编写并放进META-INF文件夹中,这两个文件的地址必须是META-INF/spring.handlers和META-INF/spring.schemas,spring会默认往载进它们,本例中spring.handlers如下所示: 
  http\://blog.csdn.net/cutesource/schema/people=stu dy.schemaExt.MyNamespaceHandler
  以上表示当使用到名为"http://blog.csdn.net/cutesource/schema/people"的schema引用时,会通过study.schemaExt.MyNamespaceHandler来完成解析 
  spring.schemas如下所示: 
  http\://blog.csdn.net/cutesource/schema/people.xsd =META-INF/people.xsd 
  以上就是载进xsd文件 

  5)在Bean文件中应用 
  到此为止一个简单的自定义配置以完成,可以在具体应用中使用了。使用方法很简单,和配置一个普通的spring bean类似,只不过需要基于我们自定义schema,本例中引用方式如下所示:<?xmlversion="1.0"encoding="UTF-8"?> 
  <beansxmlns="http://www.springframework.org/schema/beans" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns:cutesource= 

  用 AOP 来记录每个方法的执行时间(Spring ... | Oracle 10G R2版的Data Guard搭建 

分享到:
评论

相关推荐

    Spring自定义配置Schema可扩展(二)

    主要介绍了Spring自定义配置Schema可扩展(二)的相关资料,需要的朋友可以参考下

    Spring自定义配置Schema可扩展(一)

    本教程主要介绍如何扩展Spring的xml配置,让Spring能够识别我们自定义的Schema和Annotation,,需要的朋友可以参考下

    Spring中文帮助文档

    2.2.3. 可扩展的XML编写 2.2.4. Annotation(注解)驱动配置 2.2.5. 在classpath中自动搜索组件 2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. 对@AspectJ 切面的支持 2.3.3. 对bean命名pointcut...

    Spring API

    2.2.3. 可扩展的XML编写 2.2.4. Annotation(注解)驱动配置 2.2.5. 在classpath中自动搜索组件 2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. 对@AspectJ 切面的支持 2.3.3. 对bean命名pointcut...

    Spring-Reference_zh_CN(Spring中文参考手册)

    2.2.3. 可扩展的XML编写 2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. 对@AspectJ 切面的支持 2.4. 中间层 2.4.1. 在XML里更为简单的声明性事务配置 2.4.2. JPA 2.4.3. 异步的JMS 2.4.4. JDBC 2.5. ...

    Spring 2.0 开发参考手册

    2.2.3. 可扩展的XML编写 2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. 对@AspectJ 切面的支持 2.4. 中间层 2.4.1. 在XML里更为简单的声明性事务配置 2.4.2. JPA 2.4.3. 异步的JMS 2.4.4. ...

    spring chm文档

    2.2.3. 可扩展的XML编写 2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. 对@AspectJ 切面的支持 2.4. 中间层 2.4.1. 在XML里更为简单的声明性事务配置 2.4.2. JPA 2.4.3. 异步的JMS 2.4.4. ...

    Spring.3.x企业应用开发实战(完整版).part2

    1.5.3 可通过Java类提供IoC配置信息 1.5.4 通用类型转换系统和属性格式化系统 1.5.5 数据访问层新增OXM功能 1.5.6 Web层的增强 1.5.7 其他 1.6 Spring对Java版本的要求 1.7 如何获取Spring 1.8 小结 第2章 快速入门 ...

    spring.net中文手册在线版

    它提供了很多方面的功能,比如依赖注入、面向方面编程(AOP)、数据访问抽象及ASP.NET扩展等等。Spring.NET以Java版的Spring框架为基础,将Spring.Java的核心概念与思想移植到了.NET平台上。 第一章 序言 第二章 ...

    Spring3.x企业应用开发实战(完整版) part1

    1.5.3 可通过Java类提供IoC配置信息 1.5.4 通用类型转换系统和属性格式化系统 1.5.5 数据访问层新增OXM功能 1.5.6 Web层的增强 1.5.7 其他 1.6 Spring对Java版本的要求 1.7 如何获取Spring 1.8 小结 第2章 快速入门 ...

    lamp-cloud微服务脚手架

    基于Mybatis-plus-generator自定义了一套代码生成器, 通过配置数据库字段的注释,自动生成枚举类、数据字典注解、SaveDTO、UpdateDTO、表单验证规则注解、Swagger注解等。 16、定时任务调度器: 基于xxl-jobs进行了...

    Nacos2.2版本数据库适配插件.zip

    从2022年12月14日发布的Nacos2.2正式版本开始,Nacos提供了数据源扩展插件,以便让需要进行其他数据库适配的用户自己编写插件来保存数据。当前项目插件目前已简单适配Postgresql,并抽象了一套常见的兼容项的方言类...

    asp.net知识库

    关于能自定义格式的、支持多语言的、支持多数据库的代码生成器的想法 发布Oracle存储过程包c#代码生成工具(CodeRobot) New Folder XCodeFactory3.0完全攻略--序 XCodeFactory3.0完全攻略--基本思想 XCodeFactory...

    webx3框架指南PDF教程附学习Demo

    • 对Spring的直接支持 —— Spring是当今主流的轻量级框架。Webx 3.0和Spring MVC一样, 完全建立在Spring框架之上,故可运用Spring的所有特性。 • 扩展性 —— Webx 3.0对Spring做了扩展,使Spring Bean不再是...

    lamp-cloud微服务脚手架-其他

    基于Mybatis-plus-generator自定义了一套代码生成器, 通过配置数据库字段的注释,自动生成枚举类、数据字典注解、SaveDTO、UpdateDTO、表单验证规则注解、Swagger注解等。 16、定时任务调度器: 基于xxl-jobs进行了...

    Java语言基础下载

    扩展知识: 227 SocketChannel类 227 内容总结 229 独立实践 230 第十四章:数据结构与算法(上) 231 学习目标 231 算法(algorithm): 232 查找算法: 234 排序算法: 237 递归(recursive): 240 快速排序: 242 ...

Global site tag (gtag.js) - Google Analytics