1.自定义标签实现及使用
参考: http://blog.csdn.net/fighterandknight/article/details/50112701

1)创建一个需要扩展的组件 User.java

2)定义一个XSD文件,描述组件内容 user.xsd

3)创建一个java类 MyParser.java ,实现BeanDefinitionParser接口,用来解析XSD文件中的定义和组件定义

4)创建一个Handler类 MyNamespaceHandler.java ,扩展子NameSpaceHandlerSupport,目的是将组件注册到容器。

5)编写(添加)Spring.handlers和Spring.schemas文件。

类图如下:

jvm敏捷开发语言groovy 主要依赖接口 NamespaceHandlerResolver,NamespaceHandler 实现自定义标签的解析与处理。

NamespaceHandlerResolver 存在实现,可以不必管, NamespaceHandler 存在抽象实现 NamespaceHandlerSupport ,其中又依赖接口 BeanDefinitionParser,我们主要是对抽象实现AbstractSimpleBeanDefinitionParser中的doParse(),getBeanClass()进行处理。

1)创建一个需要扩展的组件 User.java

package com.base.yun.spring.beans;

public class User {

    private String name;
private String sex;
private String email;
private String id; public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
} }

2)定义一个XSD文件,描述组件内容 user.xsd

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.yun.com/schema/user"
xmlns:tns="http://www.yun.com/schema/user"
elementFormDefault="qualified"> <element name="user">
<complexType>
<attribute name="id" type="string" />
<attribute name="name" type="string" />
<attribute name="sex" type="string" />
<attribute name="email" type="string" />
</complexType>
</element> </schema>

3)创建一个java类 MyParser.java ,实现BeanDefinitionParser接口,用来解析XSD文件中的定义和组件定义

package com.base.yun.spring.parser;

import org.springframework.beans.factory.xml.AbstractSimpleBeanDefinitionParser;
import org.w3c.dom.Element; import com.base.yun.spring.beans.User; public class MyParser extends AbstractSimpleBeanDefinitionParser{ @Override
protected Class<?> getBeanClass(Element element) {
return User.class;
} }

4)创建一个Handler类 MyNamespaceHandler.java ,扩展子NameSpaceHandlerSupport,目的是将组件注册到容器。

package com.base.yun.spring.namespacehandler;

import org.springframework.beans.factory.xml.NamespaceHandlerSupport;

import com.base.yun.spring.parser.MyParser;

public class MyNamespaceHandler extends NamespaceHandlerSupport{

    public void init() {
registerBeanDefinitionParser("user", new MyParser());
}
}

5)编写(添加)Spring.handlers和Spring.schemas文件。

http\://www.yun.com/schema/user=com.base.yun.spring.namespacehandler.MyNamespaceHandler
http\://www.yun.com/schema/user.xsd=org/springframework/beans/factory/xml/user.xsd

代码目录如下:

spring源码研究2 自定义标签实现及使用的更多相关文章

  1. Spring 源码学习(1) —— 自定义标签

    Spring 工作流程是先加载解析xml配置文件:配置文件中存在默认的标签,也可以自定义标签.解析默认标签调用: private void parseDefaultElement(Element el ...

  2. Spring源码-IOC部分-自定义IOC容器及Bean解析注册【4】

    实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...

  3. Spring源码情操陶冶-自定义节点的解析

    本文承接前文Spring源码情操陶冶-DefaultBeanDefinitionDocumentReader#parseBeanDefinitions,特开辟出一块新地来啃啃这块有意思的骨头 自定义节 ...

  4. spring源码学习之默认标签的解析(一)

    继续spring源码的学习之路,现在越来越觉得这个真的很枯燥的,而且我觉得要是自己来看源码,真的看不下去,不是没有耐心,而是真的没有头绪,我觉得结合着书来看,还是很有必要的,最起码大致的流程是能够捋清 ...

  5. 【Spring源码解读】bean标签中的属性

    说明 今天在阅读Spring源码的时候,发现在加载xml中的bean时,解析了很多标签,其中有常用的如:scope.autowire.lazy-init.init-method.destroy-met ...

  6. Spring源码研究--下载-编译-导入eclipse-验证

    一,环境配置 操作系统:Unbutu14.04LTS JDK: 1.8.0_40 git: 1.9.1 gradle: 2.2.1 二,源码下载-编译-导入eclipse-验证 1,下载 使用git直 ...

  7. spring源码学习之默认标签的解析(二)

    这个是接着上一篇来写,主要是这章内容比较多,还是分开来写吧! 一.AbstractBeanDefinition属性介绍 XML中的所有的属性都可以在GenericBeanDefinition中找到对应 ...

  8. spring源码研究1 如何导入源码

    环境 jdk8 windows8 1.下载源码 https://github.com/spring-projects/spring-framework 2.编译为eclipse项目 源码下载无法直接导 ...

  9. 【Spring源码解读】bean标签中的属性(二)你可能还不够了解的 abstract 属性和 parent 属性

    abstract 属性说明 abstract 在java的语义里是代表抽象的意思,用来说明被修饰的类是抽象类.在Spring中bean标签里的 abstract 的含义其实也差不多,表示当前bean是 ...

随机推荐

  1. LeetCode--155--最小栈(java版)

    设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删除栈顶的元素. top() -- 获取栈顶元素. ...

  2. uva11609

    以三个人组队为例,3组合是:C(3,0)=1,3,3,1.还有队长的选择.有 1*0,3*1,3*2,1*3种. 组合数:            1      3        3        1 ...

  3. Tensorflow手写数字识别---MNIST

    MNIST数据集:包含数字0-9的灰度图, 图片size为28x28.训练样本:55000,测试样本:10000,验证集:5000

  4. 跨域和jsonp的原理

    什么是跨域? 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制. 所谓同源是指,域名,协议,端口均相同,不明白没关系,举个栗子: h ...

  5. 如何设置Git SSH密钥

    1. SSH 存储在user/用户名/.ssh文件夹下 生成SSH密钥 $ ssh-keygen -t rsa -C "your_email" 2. 查看生成的公钥 $ cat ~ ...

  6. Bulb Switcher (leetcode java)

    问题描述: There are n bulbs that are initially off. You first turn on all the bulbs. Then, you turn off ...

  7. js删除数组中元素的方法

    一.清空数组 var ary = [1,2,3,4]; ary.splice(0,ary.length);//清空数组 console.log(ary); // 输出 [],空数组,即被清空了 二.删 ...

  8. 兼容IE8的video写法

    <video width="100%" height="515px" controls preload> <source src=" ...

  9. PAT 1019 General Palindromic Number

    1019 General Palindromic Number (20 分)   A number that will be the same when it is written forwards ...

  10. python中RabbitMQ的使用(交换机,广播形式)

    简介 如果要让每个接收端都能收到消息,此时需要将消息广播出去,需要使用交换机. 工作原理 消息发送端先将消息发送给交换机,交换机再将消息发送到绑定的消息队列,而后每个接收端都能从各自的消息队列里接收到 ...