Spring源码学习——自定义标签
1.自定义标签步骤
- 创建一个需要扩展的组件
- 定义xsd文件描述组件内容
- 创建一个文件,实现BeanDefinitionParser接口,解析xsd文件中的定义和组件定义
- 创建handler文件,扩展NamespaceHandlerSupport,注册组件到spring容器
- 编写spring.handlers和spring.schemas文件
2.代码如下
1.编写pojo
public class User {
private String name;
private String sex;
private int age;
//省略getter、setter
}
2.xsd文件描述组件内容
<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.springtest.com/schema/user"
xmlns:tns="http://www.springtest.com/schema/user" elementFormDefault="qualified">
<!-- 表示数据类型等定义来自w3 -->
<!--表示文档中要定义的元素来自什么命名空间 -->
<!--表示此文档的默认命名空间是什么 -->
<!--表示要求xml文档的每一个元素都要有命名空间指定 -->
<!-- ……定义主体部分…… -->
<element name="user">
<complexType>
<attribute name="id" type="string"></attribute>
<attribute name="name" type="string"></attribute>
<attribute name="sex" type="string"></attribute>
<attribute name="age" type="int"></attribute>
</complexType>
</element>
</schema>
描述了一个新的targetNamespace,并定义了一个name是user的element,有id,name,sex,age属性
3.创建类,实现BeanDefinitionParser接口
package test.customtag;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.springframework.util.StringUtils;
import org.w3c.dom.Element;
import com.model.User;
public class UserBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {
// Element对应的类
protected Class getBeanClass(Element element) {
return User.class;
}
// 从element中解析并提取对应的元素
protected void doParse(Element element, BeanDefinitionBuilder bean) {
String name = element.getAttribute("name");
String sex = element.getAttribute("sex");
String age = element.getAttribute("age");
// 将提取的数据放入到BeanDefinitionBuilder中,将所有beanbeanFactory中
if (StringUtils.hasText(name)) {
bean.addPropertyValue("name", name);
}
if (StringUtils.hasText(sex)) {
bean.addPropertyValue("sex", sex);
}
if (StringUtils.hasText(age)) {
bean.addPropertyValue("age", Integer.parseInt(age));
}
}
}
4.创建handler文件,注册spring容器
package test.customtag;
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
/******创建handler文件,组件注册到spring容器***/
public class MyNamespaceHandler extends NamespaceHandlerSupport{
@Override
public void init() {
// TODO Auto-generated method stub
registerBeanDefinitionParser("user", new UserBeanDefinitionParser());
}
}
5.编写spring.handlers和spring.schemas文件,默认在工程的/META-INF/文件下
spring.handlers
http\://www.springtest.com/schema/user=test.customtag.MyNamespaceHandler
spring.schemas
http\://www.springtest.com/schema/user.xsd=META-INF/Spring-test.xsd
此处注意:
这里因为我创建的是java项目,直接在项目下建造META-INF会提示找不到对应的文件,所以这里是将文件打包成jar包导入到项目中。如下图所示
6.测试
导入自定义标签
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:myname="http://www.springtest.com/schema/user"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springtest.com/schema/user
http://www.springtest.com/schema/user.xsd
">
<myname:user id="testBean" name="aaaaaa" sex="dsaf" age="12"></myname:user>
</beans>
测试代码
public class Test {
/****测试输出*/
@org.junit.Test
public void test1(){
System.out.println("--------");
ApplicationContext act=new ClassPathXmlApplicationContext("applicationContext-service.xml");
User u=(User) act.getBean("testBean");
System.out.println("--------------"+u.toString());
}
}
输出结果
3.整个项目结构
参考自:spring源码深度解析
转载于:https://my.oschina.net/u/3429289/blog/1580825
Spring源码学习——自定义标签的更多相关文章
- Spring源码学习
Spring源码学习--ClassPathXmlApplicationContext(一) spring源码学习--FileSystemXmlApplicationContext(二) spring源 ...
- Spring源码学习-容器BeanFactory(四) BeanDefinition的创建-自定义标签的解析.md
写在前面 上文Spring源码学习-容器BeanFactory(三) BeanDefinition的创建-解析Spring的默认标签对Spring默认标签的解析做了详解,在xml元素的解析中,Spri ...
- Spring源码学习-容器BeanFactory(三) BeanDefinition的创建-解析Spring的默认标签
写在前面 上文Spring源码学习-容器BeanFactory(二) BeanDefinition的创建-解析前BeanDefinition的前置操作中Spring对XML解析后创建了对应的Docum ...
- Spring源码学习-容器BeanFactory(二) BeanDefinition的创建-解析前BeanDefinition的前置操作
写在前面 上文 Spring源码学习-容器BeanFactory(一) BeanDefinition的创建-解析资源文件主要讲Spring容器创建时通过XmlBeanDefinitionReader读 ...
- Spring源码学习笔记12——总结篇,IOC,Bean的生命周期,三大扩展点
Spring源码学习笔记12--总结篇,IOC,Bean的生命周期,三大扩展点 参考了Spring 官网文档 https://docs.spring.io/spring-framework/docs/ ...
- spring源码学习之路---IOC初探(二)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 上一章当中我没有提及具体的搭 ...
- Spring 源码学习——Aop
Spring 源码学习--Aop 什么是 AOP 以下是百度百科的解释:AOP 为 Aspect Oriented Programming 的缩写,意为:面向切面编程通过预编译的方式和运行期动态代理实 ...
- Spring 源码学习笔记10——Spring AOP
Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...
- spring源码学习之路---深入AOP(终)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 上一章和各位一起看了一下sp ...
随机推荐
- 微信小程序H5预览页面框架(二维码不隐藏)
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- Mac系统中安装virtualenv虚拟环境
总体来说有三个步骤. 1.创建工作目录. python3 -m venv lanyue_env 注意: 2.安装virtualenv. pip3 install --user virtualenv 2 ...
- mybatis源码分析--如何加载配置及初始化
简介 Mybatis 是一个持久层框架,它对 JDBC 进行了高级封装,使我们的代码中不会出现任何的 JDBC 代码,另外,它还通过 xml 或注解的方式将 sql 从 DAO/Repository ...
- 虚拟机VMware 安装后虚拟机网卡与主机网卡数据交换关系
安装好虚拟机以后,在网络连接里面可以看到多了两块网卡: 其中VMnet1是虚拟机Host-only模式的网络接口,VMnet8是NAT模式的网络接口,这些后面会详细介绍.在VMware Worksta ...
- AJ学IOS(27)UI之iOSUIKit字符属性NSAttributedString概述
AJ分享,必须精品 UIKit字符属性NSAttributedString概述 字符属性 字符属性可以应用于 attributed string 的文本中. NSString *const NSFon ...
- 复杂Excel转换与导入
需求 把不同客户提供Excel 直接导入到系统中生成对应的收货单或是出货单.后端创建收货端和出货单的接口已经有现成的webservice或是标准的xml:这类需要做的就是把客户提供不同种类的Excel ...
- [总结]Floyd算法及其应用
目录 一.Floyd算法 二.Floyd算法的应用 1. 传递闭包 例1:P2881 [USACO07MAR]排名的牛Ranking the Cows 例2:P2419 [USACO08JAN]牛大赛 ...
- 【Java】 语言基础习题汇总 [2] 面向对象
30 面向对象的三条主线和面向对象的编程思想? 类与类的成员 : 属性.方法.构造器.代码块.内部类. 面向对象的三大特征:封装.继承.多态[如果还有一个,那就是抽象] 关键字:this.super. ...
- stand up meeting 12/25/2015 & weekend 12/26/2015~12/27/2015
part 组员 工作 工作耗时/h 明日计划 工作耗时/h UI 冯晓云 在pdf阅读页面添加生词本显示:UI美化 6 完善显示 ...
- 关于Python+selenium 定位浏览器弹窗元素
首先要确定弹窗的类型: (1)div弹窗 (2)新标签页弹窗 (3)alert弹窗 一,div弹窗div弹窗是浏览器中比较好定位的弹窗,定位的方法与普通的元素一样.不过这里会有一个坑,明明可以找到这个 ...