`
alvinqq
  • 浏览: 185250 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

基于Spring可扩展Schema

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

设计配置属性和JavaBean
编写XSD文件
编写NamespaceHandler和BeanDefinitionParser完成解析工作
编写spring.handlers和spring.schemas串联起所有部件
在Bean文件中应用
下面结合一个小例子来实战以上过程

1)设计配置属性和JavaBean

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

2)编写XSD文件

为上一步设计好的配置项编写XSD文件,XSD是schema的定义文件,配置的输入和解析输出都是以XSD为契约,本例中XSD如下:
<?xml version="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:import namespace="http://www.springframework.org/schema/beans" />  

    <xsd:element name="people">  

        <xsd:complexType>  

            <xsd:complexContent>  

                <xsd:extension base="beans:identifiedType">  

                    <xsd:attribute name="name" type="xsd:string" />  

                    <xsd:attribute name="age" type="xsd:int" />  

                </xsd:extension>  

            </xsd:complexContent>  

        </xsd:complexType>  

    </xsd:element>  

</xsd:schema>

关于xsd:schema的各个属性具体含义就不作过多解释,可以参见http://www.w3school.com.cn/schema/schema_schema.asp

<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,简单的方式就是去继承这两个类。本例就是采取这种方式:
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;  
public class MyNamespaceHandler extends NamespaceHandlerSupport {  
     public void init() {  
         registerBeanDefinitionParser("people", new PeopleBeanDefinitionParser());  
     }  
 } 

其中registerBeanDefinitionParser("people", new PeopleBeanDefinitionParser());就是用来把节点名和解析类联系起来,在配置中引用people配置项时,就会用PeopleBeanDefinitionParser来解析配置。PeopleBeanDefinitionParser就是本例中的解析类:
import org.springframework.beans.factory.support.BeanDefinitionBuilder;  
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;  
import org.springframework.util.StringUtils;  
import org.w3c.dom.Element;  
public class PeopleBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {  
     protected Class getBeanClass(Element element) {  
         return People.class;  
     }  
     protected void doParse(Element element, BeanDefinitionBuilder bean) {  
         String name = element.getAttribute("name");  
         String age = element.getAttribute("age");  
         String id = 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.handlers和spring.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=study.schemaExt.MyNamespaceHandler

http\://blog.csdn.net/cutesource/schema/people=study.schemaExt.MyNamespaceHandler
http\://blog.csdn.net/cutesource/schema/people.xsd=META-INF/people.xsd

以上就是载入xsd文件

5)在Bean文件中应用

到此为止一个简单的自定义配置以完成,可以在具体应用中使用了。使用方法很简单,和配置一个普通的spring bean类似,只不过需要基于我们自定义schema,本例中引用方式如下所示:
<beans xmlns="http://www.springframework.org/schema/beans"  
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
     xmlns:cutesource="http://blog.csdn.net/cutesource/schema/people"  
     xsi:schemaLocation="  
 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
 http://blog.csdn.net/cutesource/schema/people http://blog.csdn.net/cutesource/schema/people.xsd">  
     <cutesource:people id="cutesource" name="袁志俊" age="27"/>  
</beans>

其中xmlns:cutesource="http://blog.csdn.net/cutesource/schema/people"是用来指定自定义schema,xsi:schemaLocation用来指定xsd文件。<cutesource:people id="cutesource" name="zhijun.yuanzj" age="27"/>是一个具体的自定义配置使用实例。

最后就可以在具体程序中使用基本的bean载入方式来载入我们的自定义配置对象了,如:
ApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml");  
 People p = (People)ctx.getBean("cutesource");  
 System.out.println(p.getId());  
 System.out.println(p.getName());  
 System.out.println(p.getAge());  

以上就是一个基于Spring可扩展Schema提供自定义配置支持实战过程,一些复杂应用和技巧还有待挖掘

转载:http://www.cnblogs.com/jifeng/archive/2011/09/14/2176599.html
分享到:
评论

相关推荐

    spring framework schema

    Spring Framework 是一个全面的Java应用开发框架,以其模块化、可扩展性和强大的功能而闻名。在4.2.1版本中,它引入了一系列改进和增强,以提升开发效率和应用程序性能。以下是关于“spring framework schema”及其...

    征服Spring AOP—— Schema

    在IT领域,Spring框架是Java开发中的核心组件,尤其在企业级应用中广泛使用。Spring AOP(面向切面编程)是Spring框架的一个重要...通过熟练掌握这一技术,开发者可以更好地组织代码,提升代码的可维护性和可扩展性。

    spring4.0 schema

    Spring 4.0 Schema是Spring框架的一个重要...通过深入理解和使用这些schema,我们可以更好地设计和管理Spring应用,提高代码的可维护性和灵活性。在实际项目中,可以根据需要选择并引用相应的schema,实现所需的功能。

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

    本教程将详细讲解如何实现这一过程,通过创建自定义Schema和处理注解,使得Spring能够自动发布基于注解的WebService服务。 首先,创建一个新的Java项目,并引入必要的依赖。如文中所述,可以使用Maven来创建...

    最新版spring-framework-5.0.1.RELEASE-schema.zip约束

    在5.0.1.RELEASE版本中,Spring框架引入了一系列更新和改进,以提升性能、增强可扩展性和提高开发者体验。这个压缩包“spring-framework-5.0.1.RELEASE-schema.zip”包含了与Spring框架相关的XML约束文件,这些文件...

    Spring框架约束文件 spring-framework-4.3.RELEASE-shcema

    《Spring框架约束文件详解——基于spring-framework-4.3.RELEASE-shcema》 Spring框架是Java开发领域中不可或缺的一部分,它提供了一种强大的、模块化的解决方案,用于构建可维护和可扩展的企业级应用程序。在深入...

    spring-mybatis-ssm框架的商城网站ssm-schema.rar

    这个"spring-mybatis-ssm框架的商城网站ssm-schema.rar"压缩包文件显然包含了构建一个基于SSM框架的电商网站的相关数据库模型和结构。在这里,我们将深入探讨SSM框架的核心组件以及在电商网站中的应用。 首先,...

    spring-framework-3.2.0.RC2-schema.zip

    《Spring Framework 3.2.0.RC2 ...综上所述,Spring Framework 3.2.0.RC2的各模块通过XML Schema进行配置,构建出一个高度灵活、可扩展的开发环境。理解并熟练运用这些模块,将有助于提升Java应用的开发效率和质量。

    (源码)基于Spring Boot和Vue的SaaS多租户管理系统.zip

    # 基于Spring Boot和Vue的SaaS多租户管理系统 ## 项目简介 AirbootSaaSDataSource是一个轻量级通用多租户管理系统,支持【共享数据源,独立Schema】和【独立数据源】的SaaS模式,完美支持混合云。租户之间物理隔离...

    Spring笔记.doc

    Spring 的轻量级特性意味着它不强求使用特定的数据库或技术,因此它具有很好的可扩展性。 1. 轻量级:Spring 的核心容器非常小巧,不依赖于特定的服务器或者库,这使得它易于集成到现有的系统中。 2. 无植入:...

    spring-5.3.14-dist.zip(spring-framework-5.3.14)

    《Spring Framework 5.3.14:深度解析与应用》 ...通过对docs、libs和schema的深入理解,开发者可以充分利用其特性,构建出高效、可扩展的系统。无论是新手还是经验丰富的开发者,都能从中受益匪浅。

    基于maven的cxf+spring简单demo

    在实际开发中,这种组合广泛应用于构建企业级的SOA(面向服务架构)系统,提供灵活且可扩展的服务接口。 【压缩包子文件的文件名称列表】中的"cxf.train"可能包含了整个项目的源代码、配置文件以及Maven构建相关的...

    最新版spring-framework-4.3.10.RELEASE-schema.zip约束

    每个模块都有其特定的用途和功能,共同构建了Spring Framework的强大生态系统,使得开发者能够构建高度模块化、可扩展且易于维护的企业级应用程序。了解并掌握这些模块的用法对于深入理解Spring框架至关重要。

    java+vue基于Spring Boot共享单车信息系统的设计与实现毕业论文.docx

    同时,我们还将讨论系统的安全性和可扩展性,以确保系统的可靠性和可维护性。 本篇论文的主要贡献在于设计和实现了一个基于Spring Boot的共享单车信息系统,提供了一个完整的解决方案,满足用户的需求,提高了用户...

    官方spring-framework-4.3.13.RELEASE完整包

    这是Spring框架的核心发行版,包含了所有必要的JAR文件和类库,用于开发基于Spring的应用程序。开发者可以在这里找到`spring-core`、`spring-beans`、`spring-context`、`spring-web`等核心模块,它们提供了依赖...

    硕果云,基于Spring Cloud搭建的新一代微服务教学管理平台

    【硕果云】是一个基于Spring Cloud构建的现代化微服务教学管理平台,旨在为教育机构或个人提供一套完整的教学解决方案。该平台集成了多租户体系、权限管理、在线考试以及练习功能,支持多种题型,包括单选题、多选题...

    spring-framework-4.3.30.RELEASE-dist.zip

    了解和掌握Spring Framework 4.3.30.RELEASE,意味着开发者能够利用其强大功能构建出高效、可扩展的企业级应用。通过深入学习并实践文档中的示例,可以更好地理解和运用Spring的各种特性和最佳实践,从而提升软件...

    rabbit和spring整合实战

    总之,RabbitMQ与Spring的整合是企业级应用中常见的实践,它帮助我们构建稳定、可扩展的分布式系统。通过学习和实践这个实战项目,你可以掌握如何利用这两个工具解决实际问题,提升你的IT技能。在实际操作过程中,...

    Spring5.0下载官网下载包

    5. **Spring Boot**:虽然不是直接下载包的一部分,但Spring Boot是基于Spring构建现代应用的便捷方式,它简化了设置和配置过程,提供了快速启动应用的能力。 6. **社区支持**:Spring拥有庞大的开发者社区,提供了...

    最新版完整包 spring-5.3.9.RELEASE-dist.zip

    Spring 框架是 Java 开发中的核心框架之一,它为构建高质量的、可扩展的、企业级应用程序提供了全面的编程和配置模型。最新版本的 Spring 框架是 5.3.9.RELEASE,这标志着该框架的稳定性和性能得到了进一步提升。...

Global site tag (gtag.js) - Google Analytics