自定义Spring标签
写了好几次了,结果一段时间之后就忘记了自己有写好的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());
}
}
运行结果:

自定义Spring标签的更多相关文章
- assembly打包插件引发的自定义spring标签找不到声明的错误
异常信息:通配符的匹配很全面, 但无法找到元素 的声明. 报的异常信息是关于我们使用的一个自定义的spring标签,这个异常通常的原因可能是读取不到自定义标签的映射. 到META-INF目录下找一下是 ...
- 基于Spring的可扩展Schema进行开发自定义配置标签支持
一.背景 最近和朋友一起想开发一个类似alibaba dubbo的功能的工具,其中就用到了基于Spring的可扩展Schema进行开发自定义配置标签支持,通过上网查资料自己写了一个demo.今天在这里 ...
- dubbo源码—dubbo自定义spring xml标签
dubbo为了和spring更好的集成,提供了一些xml配置标签,也就是自定义标签 spring自定义标签 spring自定义标签的方式如下: 设计配置属性和JavaBean 编写xsd文件,校验xm ...
- 6.2 dubbo在spring中自定义xml标签源码解析
在6.1 如何在spring中自定义xml标签中我们看到了在spring中自定义xml标签的方式.dubbo也是这样来实现的. 一 META_INF/dubbo.xsd 比较长,只列出<dubb ...
- 6.1 如何在spring中自定义xml标签
dubbo自定义了很多xml标签,例如<dubbo:application>,那么这些自定义标签是怎么与spring结合起来的呢?我们先看一个简单的例子. 一 编写模型类 package ...
- 使用Spring标签库
A.Spring标签库 Web项目若使用Spring Web MVC并使用JSP作为表现的话.从Spring2.0版本开始提供一套标签库可供使用. 使用标签库无非是易于开发,维护之类云云.这里就不阐述 ...
- Dubbo源码-Dubbo是如何随心所欲自定义XML标签的
叨叨 今天考虑了很久要不要写这篇文章. 距离<Dubbo源码>系列的开篇到现在已经快两个月时间了.当时是想着工作上的RPC框架使用存在一些让人头疼的问题,就来看看Dubbo给出了一套什么样 ...
- Spring Security学习笔记-自定义Spring Security过滤链
Spring Security使用一系列过滤器处理用户请求,下面是spring-security.xml配置文件. <?xml version="1.0" encoding= ...
- dubbo-config-spring自定义xml标签扩展
要实现自定义自定义标签扩展,需要有如下步骤(在spring中定义了两个接口NamespaceHandler.BeanDefinitionParser,用来实现扩展) 1.设计配置属性和JavaBean ...
随机推荐
- 【转】Java并发编程:并发容器之ConcurrentHashMap
JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了 ...
- rman 示例
背景 rman,听这名字,好像有点真的男人意思.这玩意其实也简单,只是老忘,作为一个oracle dba爱好者,怎么少了rman呢,这个好像是oracle体系的最后一环,把它掌握了,就完成oracle ...
- 快速解决PHP调用Word组件DCOM权限的问题
1. 首先必须要在电脑上安装 Office 2. windows+r : 输入 dcomcnfg.exe 打开组件服务,然后双击 组件服务 ==> 双击 计算机 ==> 双击 我的电脑 = ...
- POJ 1659
题意: 给你一个数列, 判断是否可以构成一个图, 可以则输出 构成图的一种方式 构图根据 Havel-Hakimi定理来构图 (在排序的时候注意 节点下标会变化, 故用结构体) #include< ...
- wireshark找(检测)不到(捕获)网卡的解决办法
1 前言 有时候打开wireshark,会提示找不到可用网卡,此时是因为NetGroup Packet Filter Driver 服务没有开启. 环境:笔记本 系统:Win10 网络:WIFI 2 ...
- [MySQL]group by 与 if 的统计技巧
group by查询旨在把某字段中相同的记录合并成一列,查询结果可受count(),sum()等统计函数影响 如下表 id totalclick validclick 1 3 1 2 3 1 3 5 ...
- 22)django-中间件
一:中间件介绍 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后, django会根据自己的规则在合适的时机执行中间件中相应的方法. 在dj ...
- linux指定只显示(只打印)文件中的某几行(中间几行)
[一]从第3000行开始,显示1000行.即显示3000~3999行 cat filename | tail -n +3000 | head -n 1000 [二]显示1000行到3000行 cat ...
- CDH 元数据库升级
元数据库设计到的服务:scm库:server hive库:hive amon库:cloudera management服务 元数据库要从5.7.24升级到5.7.25,为了避免升级失败导致 集群不 ...
- 【进阶3-1期】JavaScript深入之史上最全--5种this绑定全面解析(转)
这是我在公众号(高级前端进阶)看到的文章,现在做笔记 https://github.com/yygmind/blog/issues/20 this的绑定规则总共有下面5种. 1.默认绑定(严格/非严 ...