Spring框架从2.0版本开始,提供了基于Schema风格的XML扩展机制,允许开发者扩展spring配置文件。现在我们来看下怎么实现这个功能,可以参考spring帮助文档中的《Extensible XML authoring》。

我们知道如果在需要在spring.xml中配置数据源,需要进行如下的配置:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3309/sampledb" />
<property name="username" value="root" />
<property name="password" value="1234" />
</bean>

这种方式配置虽然也比较简单,但是有一个缺点:使用<property>标签不够明显,不如元素属性那么直接。现在我们希望在spring.xml中做如下的配置,就能够完成数据源的配置。

<myns:datasource id="myDataSourcce"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3309/demodb"
userName="root"
password="root" />

如果让spring能够解析这个标签,需要4步。

1、提供一个xsd文件,负责对xml的标签<datasource>进行校验。

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns="http://www.aty.com/schema/aty"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:beans="http://www.springframework.org/schema/beans"
targetNamespace="http://www.mycompany.com/schema/myns"
elementFormDefault="qualified"
attributeFormDefault="unqualified"> <xsd:import namespace="http://www.springframework.org/schema/beans" /> <xsd:element name="datasource">
<xsd:complexType>
<xsd:complexContent>
<xsd:extension base="beans:identifiedType">
<xsd:attribute name="driverClassName" type="xsd:string" use="required" />
<xsd:attribute name="url" type="xsd:string" use="required" />
<xsd:attribute name="username" type="xsd:string" use="required" />
<xsd:attribute name="password" type="xsd:string" use="required" />
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
</xsd:schema>

2、定义一个BeanDefinitionParser负责解析xml,并将必要的信息放入spring中。

package net.mingyang.spring_extensible_xml;

import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.w3c.dom.Element; public class DatasourceBeanDefinitionParser extends AbstractSingleBeanDefinitionParser { protected Class getBeanClass(Element element) {
return BasicDataSource.class;
} protected void doParse(Element element, BeanDefinitionBuilder bean) {
String driverClassName = element.getAttribute("driverClassName");
bean.addPropertyValue("driverClassName", driverClassName); String url = element.getAttribute("url");
bean.addPropertyValue("url", url); String username = element.getAttribute("username");
bean.addPropertyValue("username", username); String password = element.getAttribute("password");
bean.addPropertyValue("password", password);
}
}

3、定义个NamespaceHandler, 由sping框架的调用入口。

package net.mingyang.spring_extensible_xml;

import org.springframework.beans.factory.xml.NamespaceHandlerSupport;

public class DatasourceNamespaceHandlerSupport extends NamespaceHandlerSupport
{
public void init()
{
registerBeanDefinitionParser("datasource",
new DatasourceBeanDefinitionParser());
}
}

4、配置schema和handler。我们通过一些配置文件来告知Spring,它们就是spring.handlers和spring.schemas,它们放在META-INF目录中。
spring.handlers内容如下:

http\://www.mycompany.com/schema/myns=net.mingyang.spring_extensible_xml.DatasourceNamespaceHandlerSupport

spring.schemas内容如下:

http\://www.mycompany.com/schema/myns/myns.xsd=META-INF/myns.xsd

OK,到这里Spring需要的所有定义就完了。

测试类:

package net.mingyang.spring_extensible_xml;

import javax.sql.DataSource;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class DatasourceXmlTest
{
public static void main(String[] args)
{
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"spring.xml");
DataSource ds = (DataSource) context.getBean("myDataSourcce");
System.out.println(ds);
}
}

spring.xml内容:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:myns="http://www.mycompany.com/schema/myns"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.mycompany.com/schema/myns
http://www.mycompany.com/schema/myns/myns.xsd"> <myns:datasource id="myDataSourcce"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3309/demodb"
username="root"
password="root" /> </beans>

文件:spring-extensible-xml.rar

Spring框架的XML扩展特性的更多相关文章

  1. spring 框架的xml文件如何读取properties文件数据

    spring 框架的xml文件如何读取properties文件数据 第一步:在spring配置文件中 注意:value可以多配置几个properties文件 <bean id="pro ...

  2. 跟着刚哥学习Spring框架--通过XML方式配置Bean(三)

    Spring配置Bean有两种形式(XML和注解) 今天我们学习通过XML方式配置Bean 1. Bean的配置方式 通过全类名(反射)的方式   √ id:标识容器中的bean.id唯一. √ cl ...

  3. java代码和spring框架读取xml和properties文件

    1.java文件读取properties文件 Properties props = new Properties(); try { //资源文件存放在类文件的根目录下.即是放在src下面.则不需要写路 ...

  4. 配置Spring框架编写XML的提示

    1. 步骤一:先复制, http://www.springframework.org/schema/beans/spring-beans.xsd 2. 步骤二:搜索XML Catalog,点击Add按 ...

  5. 【常用配置】Spring框架web.xml通用配置

    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java. ...

  6. spring框架 事务 xml配置方式

    user=LF password=LF jdbcUrl=jdbc:oracle:thin:@localhost:1521:orcl driverClass=oracle.jdbc.driver.Ora ...

  7. Spring框架——基于XML/注解开发

    IoC的实现方式有两种:XML配置文件.基于注解. MVC开发模式: Controller层 Service层 Repository层 Controller层调用Service,Service调用Re ...

  8. Spring框架配置beans.xml

    Spring学习笔记(一) 一.Spring 框架 Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 ...

  9. spring框架篇(一)-------spring简介与配置文件使用控制反转事例

    spring简介 Spring 是一个开源框架,中文意思就是春天,也许是作者想让自己的这个框架给Java开发人员带来春天吧.其官方网站是 https://spring.io/ ,可以在官方网站下载到完 ...

随机推荐

  1. C++学习笔记34:泛型编程拓展3

    输入流迭代器 #include <iostream> #include <iterator> #include <algorithm> #include <v ...

  2. Fiddler2 主菜单

    Fiddler2 主菜单 六个主菜单分别是: 文件(File) Capture Traffic ——启用捕获功能,快捷键 F12 此功能的开启/关闭状态,程序安装后默认是开启的.可以在 Fiddler ...

  3. Apache2 同源策略解决方案 - 配置 CORS

    什么是同源策略 现在的浏览器大多配有同源策略(Same-Origin Policy),具体表现如下: 浏览某一网站,例如 http://www.decembercafe.org/.这个网页中的 Aja ...

  4. 一些js小知识点整理

    string.substring(a,b)   从a点开始截取,到b点结束 string.substr(a,b)    从a点开始截取,截取b个 BOM的四个对象,navigator.screen.l ...

  5. tomcat端口号被占用或者修改端口号的解决方法

    一)修改端口号: 在tomcat文件中找到conf里面的server.xml 在tomcat解压后的文件中按照下图操作

  6. 通过js的console优雅的将php调试信息输出

    function consoleLog($val){ $debug = debug_backtrace(); unset($debug[0]['args']); echo '<script> ...

  7. mysql 与 mycat集成读写分离

    1,先说下同步数据库原理,其实很简单.就是在主库做数据库操作的时候,会生成一个本地日志,日志会在my.ini当中配置看图一,读库会实时去扫描日志,如果有更新就直接在读库执行. 这个是主库my.ini配 ...

  8. Java JDBC使用方法

    public class JDBC{public static void main(String[] args){//查询数据selectData();}//查询数据的方法private static ...

  9. Android延时执行调用的几种方法

    一.开启新线程 new Thread(new Runnable(){        public void run(){            Thread.sleep(XXXX);          ...

  10. 2016HUAS_ACM暑假集训3F - Jungle Roads

    这个题目属于最小生成树问题,可以用Prim,也可以用Kruskal(还没试).题意简单直接,给你一个图,求出它最小生成树的权值. 题目最有趣的地方就是图的顶点是字母,稍微处理一下就好了. Sample ...