1.自定义标签步骤

  1. 创建一个需要扩展的组件
  2. 定义xsd文件描述组件内容
  3. 创建一个文件,实现BeanDefinitionParser接口,解析xsd文件中的定义和组件定义
  4. 创建handler文件,扩展NamespaceHandlerSupport,注册组件到spring容器
  5. 编写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源码学习——自定义标签的更多相关文章

  1. Spring源码学习

    Spring源码学习--ClassPathXmlApplicationContext(一) spring源码学习--FileSystemXmlApplicationContext(二) spring源 ...

  2. Spring源码学习-容器BeanFactory(四) BeanDefinition的创建-自定义标签的解析.md

    写在前面 上文Spring源码学习-容器BeanFactory(三) BeanDefinition的创建-解析Spring的默认标签对Spring默认标签的解析做了详解,在xml元素的解析中,Spri ...

  3. Spring源码学习-容器BeanFactory(三) BeanDefinition的创建-解析Spring的默认标签

    写在前面 上文Spring源码学习-容器BeanFactory(二) BeanDefinition的创建-解析前BeanDefinition的前置操作中Spring对XML解析后创建了对应的Docum ...

  4. Spring源码学习-容器BeanFactory(二) BeanDefinition的创建-解析前BeanDefinition的前置操作

    写在前面 上文 Spring源码学习-容器BeanFactory(一) BeanDefinition的创建-解析资源文件主要讲Spring容器创建时通过XmlBeanDefinitionReader读 ...

  5. Spring源码学习笔记12——总结篇,IOC,Bean的生命周期,三大扩展点

    Spring源码学习笔记12--总结篇,IOC,Bean的生命周期,三大扩展点 参考了Spring 官网文档 https://docs.spring.io/spring-framework/docs/ ...

  6. spring源码学习之路---IOC初探(二)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 上一章当中我没有提及具体的搭 ...

  7. Spring 源码学习——Aop

    Spring 源码学习--Aop 什么是 AOP 以下是百度百科的解释:AOP 为 Aspect Oriented Programming 的缩写,意为:面向切面编程通过预编译的方式和运行期动态代理实 ...

  8. Spring 源码学习笔记10——Spring AOP

    Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...

  9. spring源码学习之路---深入AOP(终)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 上一章和各位一起看了一下sp ...

随机推荐

  1. Serverless无服务器云函数入门唠叨

    B站录了个视频: https://www.bilibili.com/video/av59020925/

  2. flask入门 之 Python Shell (三)

    1.代码: #encoding:utf-8 from flask_sqlalchemy import SQLAlchemy from flask_script import Manager,Shell ...

  3. Array(数组)对象-->push() 方法

    1.定义和用法 push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度. 语法: array.push(item1, item2, ..., itemX) 参数:item1, item2, ...

  4. python调用js

    安装 pip install PyExecJS 方法 eval() 输入参数:source(JS语句).cwd(路径) 返回值:result(语句执行结果) compile() 输入参数:source ...

  5. 树状数组模板--Color the ball

    Color the ball HDU - 1556 N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电 ...

  6. 【FreeMarker】【程序开发】数据模型,对象包装

    [FreeMarker][程序开发]数据模型,对象包装 分类: Java.FreeMarker2014-10-25 18:49 413人阅读 评论(0) 收藏 举报 FreeMarker   目录(? ...

  7. Vmware Centos 与 windows 创建共享目录

    一路路都是坑~~ 只为了安装orcle的jdk~~,然而Orcle下载jdk是需要登录才能下载的,所以我在Centos7下使用 wget / curl  都下载不了哦~jdk7 第一步:Vmvare ...

  8. ORCAD常用元件库说明

    以下是ORCAD自带库文件的说明,路径:Cadence\Cadence_SPB_16.6\tools\capture\library 1' AMPLIFIER.OLB共182个零件,存放模拟放大器IC ...

  9. Html5移动端弹幕动画实现示例代码

    已知20条内容要有弹幕效果,分成三层,速度随机. 先来看看效果: 所以这里不考虑填写生成的.只是一个展现的效果. 如果要看填写生成的,请不要浪费Time 思路 把单个内容编辑好,计算自身宽度,确定初始 ...

  10. webpack 中常用安装插件的一些命令

    1:npm install html-webpack-plugin --save-dev //自动快速的帮我们生成HTML.2:npm install css-loader style-loader  ...