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. 动态加载DataGrid表头及数据

    初始化表头 js生成前端 /*初始化表头*/ function initDataGridTitle(id) { $.ajax({ url: '/${appName}/report/***/***', ...

  2. pytorch学习记录

    1.pytorch中的torch.split只能将tensor分割为相等的几分,如果需要特定的需求将tensor分割开,可以用torch.index_select.使用的时候,先生成index索引,示 ...

  3. 安装redisPHP扩展

    1. "predis/predis":"~1.1@dev" 2.composer update 即可,这是给项目添加redis扩展 启动服务端 redis-se ...

  4. Two Melodies CodeForces - 813D (DP,技巧)

    https://codeforces.com/problemset/problem/813/D dp[i][j] = 一条链以i结尾, 另一条链以j结尾的最大值 关键要保证转移时两条链不能相交 #in ...

  5. BCS SET EMAIL

    FUNCTION zcrm_send_email. *"------------------------------------------------------------------- ...

  6. CentOS虚拟机和物理机共享文件夹实现

    安装open-vm-tools: yum -y install  open-vm-tools yum -y  install open-vm-tools yum -y install  open-vm ...

  7. ECharts 报表事件联动系列一:刷新页面

    本示例实现了以下功能: 1.点击刷新按钮,仅刷新柱状图,而不是整个页面 2.点击柱状内容刷新柱状图,并更新title 3.点击X轴,Y轴更新title,并弹出alert. 源码代码如下: <!D ...

  8. select 练习语句

    select * from scott.dept;            /查看scott.dept表中的全局信息.        describe    scott.emp:             ...

  9. 解决VS Code保存时候自动格式化

    VS code 保存会自动格式化.以前都是alt+shift+F格式化的,现在一保存就格式化 解决方式:找到你的VScode扩展,把JS-CS-HTML Formatter这个插件禁用就可以解决

  10. MFC CDHtmlDialog 加载本地资源

    步骤:1.资源视图 项目右击选择资源添加,自定义添加新类型 如:JS(会增加JS文件夹)2. 选择1新建的文件夹右击 添加资源 导入 选择js文件引入3. 在资源文件Resource.h文件夹能找到资 ...