写了好几次了,结果一段时间之后就忘记了自己有写好的example,但是最后还是决定重新写一遍,把这个步骤记录下来

首先看整个项目结构

从transaction.xml开始,虽然图上报错了,实际上运行并没有问题,IDE功能的不完善吧。

其中声明了sb命名空间,并且schemaLocation中写明了schema地址是http://www.springbank.com/schema/springbank.xsd

<?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:sb="http://www.springbank.com/schema/springbank"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springbank.com/schema/springbank http://www.springbank.com/schema/springbank.xsd
">
<!-- 交易处理器扫描并实例化 -->
<context:component-scan base-package="com.springbank.portal.controller"/>
<sb:transaction id="testTransaction" action="testAction" template="noTemplate"></sb:transaction>
</beans>

显然不会真的去http://www.springbank.com/schema/springbank.xsd寻找xsd,spring实际上是从spring.schemas文件里去寻找真正的地址,我这个example项目中,spring.schemas文件只有一行:

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

springbank.xsd的内容是

<?xml version="1.0" encoding="UTF-8"?>
<schema
xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.springbank.com/schema/springbank"
xmlns:op="http://www.springbank.com/schema/springbank" elementFormDefault="qualified">
<element name="transaction">
<complexType>
<attribute name="id" type="string" use="required"/>
<attribute name="action" type="string" use="required"/>
<attribute name="template" type="string" use="required"/>
</complexType>
</element>
<element name="template" />
<element name="action">
<complexType>
<attribute name="id" type="string" use="required"/>
<attribute name="class" type="string" use="required"/>
</complexType>
</element>
</schema>

schema的声明这个步骤就算完成了。接下来是要配置这个标签的解析类,这个配置在spring.handlers中完成:

http\://www.springbank.com/schema/springbank=com.demo.springtag.support.SpringbankNamespaceHandlerSupport

SpringbankNamespaceHandlerSupport类:

package com.demo.springtag.support;

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

public class SpringbankNamespaceHandlerSupport extends NamespaceHandlerSupport {

    @Override
public void init() {
registerBeanDefinitionParser("transaction", new TagTransactionBeanDefinitionParser());
}
}

TagTransactionBeanDefinitionParser类

package com.demo.springtag.support;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.springframework.util.StringUtils;
import org.w3c.dom.Element; /**
* @author wangxin
* @contact 408657544@qq.com
* @date Jul 11, 2017
* @Description:用于解析transaction标签
*/
public class TagTransactionBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {
private final Logger log = LoggerFactory.getLogger(getClass()); @Override
protected Class<?> getBeanClass(Element element) {
return Transaction.class;
}
protected void doParse(Element element, BeanDefinitionBuilder bean) {
String id = element.getAttribute("id");
String action = element.getAttribute("action");
String template = element.getAttribute("template"); if (StringUtils.hasText(id)) {
bean.addPropertyValue("id", id);
}
if (StringUtils.hasText(action)) {
bean.addPropertyValue("action", action);
}
if (StringUtils.hasText(template)) {
bean.addPropertyValue("template", template);
}
}
}

Transaction类

package com.demo.springtag.support;

public class Transaction {
private String id;
private String template;
private String action; public Transaction() {
System.out.println("Bean Transaction have been created: "+toString());
} public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public String getTemplate() {
return template;
} public String getAction() {
return action;
} public void setAction(String action) {
this.action = action;
} public void setTemplate(String template) {
this.template = template;
} @Override
public String toString() {
return "Transaction [id=" + id + ", template=" + template + "]";
} }

最后是测试类:

public class Main {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:transaction.xml");
Transaction transaction = (Transaction)context.getBean("testTransaction");
System.out.println(transaction.getTemplate());
}
}

运行结果:

最新文章

  1. 通过Gradle为APK瘦身
  2. Why is HttpContext.Current null after await?
  3. 使用zabbix邮件发送报表
  4. WebAPI的一种单元测试方案
  5. Flume1.5.0的安装、部署、简单应用(含伪分布式、与hadoop2.2.0、hbase0.96的案例)
  6. Robberies
  7. 多线程+委托的安全访问(invoke)
  8. Simple Arithmetics
  9. UIMenuController/UIPasteboard(2) UITableView上实用剪贴板
  10. Golang网络库中socket阻塞调度源码剖析
  11. javaEE开发中使用session同步和token机制来防止并发重复提交
  12. [PHP]引用返回与节省内存
  13. Python——字符格式化
  14. Hibernate实例——Customer表的展示
  15. PHP知识梳理
  16. MySQL:数据表基本操作
  17. RADIDE MultiPaste
  18. 原生 JS 实现手机验证码倒计时
  19. ios学习之旅--oc对象的关系
  20. HTML怎么让img 等比例缩放

热门文章

  1. python3+selenium入门14-上传下载文件
  2. Django 中的 model 继承
  3. 【转】C++中substr的用法
  4. 数据库中关于convert的参数学习(转化函数用法)
  5. jqGrid后台交互样例
  6. mtu简单说明
  7. Python-HTML转义字符
  8. python-GIL、死锁递归锁及线程补充
  9. spring、springMVC、mybatis配置文件
  10. 姿势摆好,一招学会android的布局优化!