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. springboot actuator 配置安全

    springboot actuator监控是什么?类似php的phpinfor()函数,不过actuator更强大,可以查看的数据.状态更多.Actuator是Spring Boot提供的对应用系统的 ...

  2. 关于AUI框架自学心得

    2018年8月25日今天星期六,这段时间接触到移动端布局框架AUI,借着早上一个小时时间大致看了一下开发文档(后面统称文档),对AUI一点认识. 目前2.0版本为最新版,这个版本和1.0比较升级很多. ...

  3. IO 模型知多少

    1. 引言 同步异步I/O,阻塞非阻塞I/O是程序员老生常谈的话题了,也是自己一直以来懵懵懂懂的一个话题.比如:何为同步异步?何为阻塞与非阻塞?二者的区别在哪里?阻塞在何处?为什么会有多种IO模型,分 ...

  4. Android AIDL[Android Interface Definition Language]跨进程通信

    全称与中文名IPC:Inter-Process Communication(进程间通信)Ashmem:Anonymous Shared Memory(匿名共享内存)Binder:Binder(进程间通 ...

  5. Flask 入门(三)

    官方的文档虽然正规,但是有点太过书面语,有时候,明明很简单的一个程序,如果非要看它的说明,反而会让人疑惑不解,倒不如看一下别人写的简单的一个demo,jinjia2模板看官方的文档看了5回,愣是不明白 ...

  6. 查看jdk 线程 日志

    命令:jstack(查看线程).jmap(查看内存)和jstat(性能分析)命令 这些命令 必须 在 linux jdk bin 路径 下执行 eq: ./jstack 10303 即可  如果想把 ...

  7. 委托的 `DynamicInvoke` 小优化

    委托的 DynamicInvoke 小优化 Intro 委托方法里有一个 DynamicInvoke 的方法,可以在不清楚委托实际类型的情况下执行委托方法,但是用 DynamicInvoke 去执行的 ...

  8. linux常用命令整理(一)

    1.sort(排序) 典型例题:sort -t: -k3n /etc/passwd 以冒号为分隔符根据第三个域的数字大小进行排序(默认分隔符是空格) 2.uniq(去除文件中的连续重复行) 典型例题: ...

  9. Three.js三维模型几何体旋转、缩放和平移

    创建场景中的三维模型往往需要设置显示大小.位置.角度,three.js提供了一系列网格模型对象的几何变换方法,从WebGL的角度看,旋转.缩放.平移对应的都是模型变换矩阵,关于矩阵变换内容可以观看本人 ...

  10. Git应用详解第十讲:Git子库:submodule与subtree.md

    前言 前情提要:Git应用详解第九讲:Git cherry-pick与Git rebase 一个中大型项目往往会依赖几个模块,git提供了子库的概念.可以将这些子模块存放在不同的仓库中,通过submo ...