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 ...
随机推荐
- Serverless无服务器云函数入门唠叨
B站录了个视频: https://www.bilibili.com/video/av59020925/
- flask入门 之 Python Shell (三)
1.代码: #encoding:utf-8 from flask_sqlalchemy import SQLAlchemy from flask_script import Manager,Shell ...
- Array(数组)对象-->push() 方法
1.定义和用法 push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度. 语法: array.push(item1, item2, ..., itemX) 参数:item1, item2, ...
- python调用js
安装 pip install PyExecJS 方法 eval() 输入参数:source(JS语句).cwd(路径) 返回值:result(语句执行结果) compile() 输入参数:source ...
- 树状数组模板--Color the ball
Color the ball HDU - 1556 N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电 ...
- 【FreeMarker】【程序开发】数据模型,对象包装
[FreeMarker][程序开发]数据模型,对象包装 分类: Java.FreeMarker2014-10-25 18:49 413人阅读 评论(0) 收藏 举报 FreeMarker 目录(? ...
- Vmware Centos 与 windows 创建共享目录
一路路都是坑~~ 只为了安装orcle的jdk~~,然而Orcle下载jdk是需要登录才能下载的,所以我在Centos7下使用 wget / curl 都下载不了哦~jdk7 第一步:Vmvare ...
- ORCAD常用元件库说明
以下是ORCAD自带库文件的说明,路径:Cadence\Cadence_SPB_16.6\tools\capture\library 1' AMPLIFIER.OLB共182个零件,存放模拟放大器IC ...
- Html5移动端弹幕动画实现示例代码
已知20条内容要有弹幕效果,分成三层,速度随机. 先来看看效果: 所以这里不考虑填写生成的.只是一个展现的效果. 如果要看填写生成的,请不要浪费Time 思路 把单个内容编辑好,计算自身宽度,确定初始 ...
- webpack 中常用安装插件的一些命令
1:npm install html-webpack-plugin --save-dev //自动快速的帮我们生成HTML.2:npm install css-loader style-loader ...
