spring文件配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?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:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:task="http://www.springframework.org/schema/task"
xmlns:mysql="http://sammor.javaeye.com/schema/tags"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://sammor.javaeye.com/schema/tags
http://sammor.javaeye.com/schema/tags/springtags.xsd">

<mysql:client id="mysqlCusDatasource" ip="localhost" port="3306" characterEncoding="utf8"
dbname="test" username="root" password="123456"/>


</beans>

xsd文件
META-INF/spring.handlers

1
http\://sammor.javaeye.com/schematags=book.spring.MysqlTagDatasourceNamespaceHander

META-INF/spring.schemas

1
http\://sammor.javaeye.com/schema/tags=book.spring.MysqlTagDatasourceNamespaceHander
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns="http://sammor.javaeye.com/schema/tags"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:beans="http://www.springframework.org/schema/beans"
targetNamespace="http://sammor.javaeye.com/schema/tags"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xsd:import namespace="http://www.springframework.org/schema/beans" />
<xsd:element name="client">
<xsd:annotation>
<xsd:documentation>mysqls datasource definition</xsd:documentation>
</xsd:annotation>
<xsd:complexType>
<xsd:complexContent>
<!-- 继承定义 从namespace="http://www.springframework.org/schema/beans" -->
<xsd:extension base="beans:identifiedType">
<xsd:attribute name="dbname" type="xsd:string" use="required" />
<xsd:attribute name="ip" type="xsd:string"
use="required"/>
<xsd:attribute name="port" type="xsd:long"
use="required"/>
<xsd:attribute name="username" type="xsd:string" use="required" />
<xsd:attribute name="password" type="xsd:string" use="required" />
<xsd:attribute name="characterEncoding" type="xsd:string"
default="utf8">
</xsd:attribute>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
</xsd:schema>

需要用到的java代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14

package book.spring;

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

public class MysqlTagDatasourceNamespaceHander extends NamespaceHandlerSupport {


@Override
public void init() {
registerBeanDefinitionParser("client",new MysqlClientTagParser());
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package book.spring;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.util.JdbcConstants;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.beans.factory.xml.BeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.w3c.dom.Element;

public class MysqlClientTagParser implements BeanDefinitionParser {


/**
*
<mysql:client id="sqlMapClient" ip="localhost" port="3306"
characterEncoding="utf8"
dbname="freebug" username="root" password="123456"/>


* */
@Override
public BeanDefinition parse(Element element, ParserContext parserContext) {

String id = element.getAttribute("id");
boolean contains =parserContext.getRegistry().containsBeanDefinition(id);
if(contains){
throw new RuntimeException("已存在了id为"+id+"的bean了");
}

RootBeanDefinition beanDefinition = new RootBeanDefinition();
beanDefinition.setBeanClass(DruidDataSource.class);
beanDefinition.setLazyInit(false);


MutablePropertyValues values =new MutablePropertyValues();


values.add("username",element.getAttribute("username"));
values.add("password",element.getAttribute("password"));
values.add("dbType",JdbcConstants.MYSQL);
values.add("initialSize",3);
values.add("defaultAutoCommit",false);
values.add("defaultAutoCommit",false);
values.add("driverClassName","com.mysql.jdbc.Driver");

values.add("url","jdbc:MySql://"+element.getAttribute("ip")+":"+element.getAttribute("port")+"/"+element.getAttribute("dbname")+"");

beanDefinition.setPropertyValues(values);

parserContext.getRegistry().registerBeanDefinition(id,beanDefinition);

/**
*
<mysql:client id="sqlMapClient" ip="localhost" port="3306" characterEncoding="utf8"
dbname="freebug" username="root" password="123456"/>
* */
return beanDefinition;
}



}

运行实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package book.spring;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import javax.sql.DataSource;

public class MycusTagTest {

public static void main(String[] args) throws Exception{
ClassPathXmlApplicationContext classPathXmlApplicationContext =new ClassPathXmlApplicationContext("spring-tags-cus.xml");


DataSource dataSourc =(DataSource) classPathXmlApplicationContext.getBean("mysqlCusDatasource");

System.out.println(dataSourc.getConnection().getMetaData().getDatabaseProductName());
classPathXmlApplicationContext.start();

synchronized (MycusTagTest.class) {
while (true) {
try {
MycusTagTest.class.wait();
} catch (InterruptedException e) {
}
}
}
}
}