Spring框架從2.0版本開始,提供了基於Schema風格的XML擴展機制,容許開發者擴展spring配置文件。如今咱們來看下怎麼實現這個功能,能夠參考spring幫助文檔中的《Extensible XML authoring》。html
咱們知道若是在須要在spring.xml中配置數據源,須要進行以下的配置:java
<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中作以下的配置,就可以完成數據源的配置。mysql
<myns:datasource id="myDataSourcce" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3309/demodb" userName="root" password="root" />
若是讓spring可以解析這個標籤,須要4步。spring
一、提供一個xsd文件,負責對xml的標籤<datasource>進行校驗。sql
<?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>
二、定義一個BeanDefinitionParser負責解析xml,並將必要的信息放入spring中。apache
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); } }
三、定義個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()); } }
四、配置schema和handler。咱們經過一些配置文件來告知Spring,它們就是spring.handlers和spring.schemas,它們放在META-INF目錄中。
spring.handlers內容以下: dom
http\://www.mycompany.com/schema/myns=net.mingyang.spring_extensible_xml.DatasourceNamespaceHandlerSupport
spring.schemas內容以下:ide
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>