Spring
2.5在2.0的基于Schema的Bean配置的基础之上,再增加了扩展XML配置的机制。通过该机制,我们可以编写自己的Schema,并根据自定义的Schema用自定的标签配置Bean。要使用的Spring的扩展XML配置机制,也比较简单,有以下4个步骤:
-
编写自定义Schema文件;
-
编写自定义NamespaceHandler;
-
编写一个或者多个自定义BeanDefinition;
-
在Spring中注册上述组建
下面是一块自定义的Bean配置:
myns:dateformat id=”dateFormat” pattern=”yyyy-MM-dd HH:mm”
lenient=”true” />
与其等价的常规Bean配置为:
<bean id="dateFormat" class="java.text.SimpleDateFormat">
<constructor-arg value="yyyy-MM-dd HH:mm" />
<property name="lenient" value="true" />
</bean>
为了让Spring能识别这段配置,我们需要按上述的4件事。
编写Schema
对于Schema的内容,可以参见http://www.w3school.com.cn/schema/schema_elements_ref.asp,最终的Schema如下:
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/mydateformat" elementFormDefault="qualified">
<import namespace="http://www.springframework.org/schema/beans" />
<element name="dateformat">
<complexType>
<complexContent>
<extension base="beans:identifiedType">
<attribute name="lenient" type="boolean" />
<attribute name="pattern" type="string" use="required" />
</extension>
</complexContent>
</complexType>
</element>
</schema>
编写NamespaceHandler
为了让Spring在解析Bean配置时能识别<myns:dateformat>这个标签,我们需要一个自定义的NamespaceHandler。Spring的NamespaceHandler接口有3个方法:
-
Init():初始化方法,由Spring调用;
- BeanDefinition parse(Element ,ParserContext):由Spring在解析Bean配置文件遇见顶级的(<myns:dateformat>)标签时调用。该方法可以直接在Spring中注册一个Bean Definition,也可以将Bean Definition返回由其他模块去注册;
- BeanDefinition decorate(Node, BeanDefinitionHolder, ParserContext):解析过程中遇见attribute或者嵌套的其他命名空间下的element时调用;
在上述3个方法中,只有init()方法是必须的,而其他两个方法则不是必须的,只有在一些特殊情况下才需要用特殊的方式现实它们。为此,Spring提供了一个NamespaceHandlerSupport类,扩展该类就可以轻易得到我们要的自定义NamespaceHandler。
package com.ronry.springtest.schema;
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
public class MyNamespaceHandler extends NamespaceHandlerSupport {
@Override
public void init() {
this.registerBeanDefinitionParser("dateformat", new SimpleDateFormatBeanDefinitionParser());
}
}
编写自定义的BeanDefinitionParser
BeanDefinitionParser用来将Bean配置文件解析成相应的BeanDefinition,一般在NamespaceHandler中使用。一般来讲,Bean配置文件,每个顶级的配置元素(例如本例中的<dateformat>)都有一个对应的BeanDefinitionParser。Spring也为自定义BeanDefinitionParser提供了很多支持,再一些抽象类的基础上添加少量功能即可满足大部分需求。
package com.ronry.springtest.schema;
import java.text.SimpleDateFormat;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.w3c.dom.Element;
public class SimpleDateFormatBeanDefinitionParser extends
AbstractSingleBeanDefinitionParser {
protected Class<SimpleDateFormat> getBeanClass(Element element){
return SimpleDateFormat.class;
}
protected void doParse(Element element,BeanDefinitionBuilder bean){
String pattern=element.getAttribute("pattern");
bean.addConstructorArgValue(pattern);
String lenient=element.getAttribute("lenient");
bean.addPropertyValue("lenient", Boolean.valueOf(lenient));
}
}
在Spring中注册
有了Schema,有了NamespaceHandler,也有了BeanDefinitionParser,但是只有让Spring知道这些组建的存在,它们才能真正开始工作。为了让Spring能检测到这些组建,只需在META-INF目录下添加两个配置文件(spring.handler和spring.schema)即可。
Spring.handler文件告诉Spring某个name space需要用哪个NamespaceHandler,例如:
http\://www.example.org/mydateformat=com.ronry.springtest.schema.MyNamespaceHandler
|
http://www.example.org/mydateformat要与在Schema中定义的一致。
spring.schema文件,则告诉Spring从哪加载在Bean定义文件中指定的xsd文件,例如:
http\://www.example.org/schema/dateformat.xsd=com/ronry/springtest/schema/dateformat.sd
|
如果没有这个文件,则Spring将会从网络中查找对应的xsd文件。反过来,有了这个文件也就使得xsd文件就必须和对应的代码一起在JAR包中发布了。
完成了以上的工作之后,Spring就能认识我们自定的Bean的配置了。当然,这只是最简单的对spring xml配置的扩展。更复杂的情况的扩展请听下回分解。
分享到:
相关推荐
本示例代码“扩展Spring schema样例代码 maven”旨在介绍如何在Spring框架中扩展自定义的schema,以及如何在一个Maven项目中整合这些扩展。 首先,让我们深入理解Spring Schema扩展的概念。Spring Schema是Spring ...
以下是关于“spring framework schema”及其相关标签“springschema”的详细知识点: 1. **Schema**: 在Spring Framework中,schema是一种XML配置方式,用于定义bean的行为和依赖关系。例如,`jdbc`、`jms`、`cache...
Spring 4.0 Schema是Spring框架的一个重要组成部分,它定义了Spring配置文件的结构和语义,使得开发者可以通过XML配置来声明式地管理应用程序的组件和依赖关系。在这个压缩包中,包含了多个子目录,每个目录对应...
《Spring Framework 4.2.4.RELEASE:深入解析Schema》 Spring Framework是Java平台上的一个核心企业级应用框架,以其模块化、可扩展性和强大的功能而闻名。4.2.4.RELEASE版本是该框架的一个重要里程碑,它带来了...
本次我们聚焦于"spring-5.2.9.RELEASE-schema.zip"压缩包,通过其包含的子文件,深入探讨Spring 5.2.9版本的关键概念和组件。 1. **Mvc(Model-View-Controller)模块**: Spring MVC是Spring框架的一个重要组成...
“所有jar包和schema源文件 很全很全”意味着这个压缩包可能包含了Spring框架的完整集合,包括不同版本的JAR文件,可能还有相关的XML Schema文件。XML Schema(XSD)文件是用于定义XML文档结构和数据类型的规范。在...
本篇文章将聚焦于“自定义Schema解析Spring Bean”这一主题,这是一项高级功能,允许开发者扩展Spring的XML配置能力,以满足特定项目的需要。 自定义Schema解析是Spring框架提供的一个强大特性,它允许开发者创建...
《Spring Framework 4.2.5 Schema 深度解析》 Spring Framework 是一个全面的Java应用程序开发框架,以其模块化、灵活性和强大的功能而备受赞誉。在4.2.5版本中,Spring引入了对各种XML Schema的支持,极大地简化了...
13. **Spring Schema**:"spring-5.3.9-schema.zip"可能包含了 Spring 框架的 XML 配置的架构文件,这些文件定义了合法的元素和属性,有助于验证和编辑配置文件。 总的来说,Spring 5.3.9.RELEASE 是一个功能丰富且...
《Spring Framework 4.3.4.RELEASE Schema详解》 Spring Framework是Java开发中的一个核心框架,它为创建高效、灵活且可测试的Java应用程序提供了强大的支持。在4.3.4.RELEASE版本中,Spring引入了对XML Schema的...
在Spring框架中,自定义配置Schema的扩展是提高应用程序灵活性和可配置性的重要方式。它允许开发者定义自己的XML标签和属性,以适应特定项目的需求。本文将深入探讨Spring自定义配置Schema的可扩展性,特别是在第二...
本教程将详细讲解如何实现这一过程,通过创建自定义Schema和处理注解,使得Spring能够自动发布基于注解的WebService服务。 首先,创建一个新的Java项目,并引入必要的依赖。如文中所述,可以使用Maven来创建...
在Spring框架中,schema约束是XML配置文件中的一个重要组成部分,它们定义了如何正确地配置Spring容器中的各种组件,如bean、property、aop等。Spring 4.2.0是该框架的一个版本,引入了一些新的特性和改进,同时也对...
需要注意的是,不同的Spring版本可能对应不同的Schema文件,例如上述例子中的`spring-beans-2.5.xsd`是Spring 2.5版本的Schema,如果你使用的是其他版本,需要找到相应版本的Schema文件并进行替换。此外,MyEclipse...
11. **Spring Schema**:`spring-framework-5.0.4.RELEASE-schema.zip`可能包含Spring的XML Schema定义,这些定义帮助开发者在编写XML配置时进行验证,确保正确性。 总的来说,Spring Framework 5.0.4.RELEASE是一...
在Spring框架中,自定义Schema允许开发者扩展XML配置,创建自己的标签来定义Bean,从而更加灵活地管理应用程序的配置。Spring 2.5引入了这一特性,使得开发者可以在标准的Spring Schema基础上添加自定义功能。以下是...
这个"spring-framework-4.1.5.RELEASE-schema.zip"压缩包包含了Spring框架在不同模块中的XML Schema定义,这些定义帮助开发者以结构化的方式配置Spring应用。 1. **jee**:这个子目录下的文件与Java EE(Enterprise...
本篇文章将深入探讨Spring AOP的Schema实现,即基于XML配置的方式来理解和应用AOP。 一、Spring AOP基础概念 1. 切面(Aspect):切面是关注点的模块化,例如日志、事务管理。在Spring AOP中,切面由通知(Advice...
在使用Spring,写核心配置文件的时候都引入了不一样的约束,这里总结关于spring的XML约束+Schema约束。以后不管是仅使用ioc功能还是aop,把全部的约束引入即可。至于说如何找到这些约束的代码的过程,也在这个文档...