springbank 开发日志 Spring启动过程中对自定义标签的处理
这篇随笔的许多知识来源于:http://www.importnew.com/19391.html
之所以会去看这些东东,主要是希望能够模仿spring mvc的处理流程,做出一套合理的交易处理流程。
之前已经根据网上查到的知识,做了一些尝试,只要按照如下流程,就可以使用自定义的命名空间:
1.通过在spring的配置文件中配置自己的命名空间
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:sb="http://www.springbank.com/schema/springbank"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springbank.com/schema/springbank http://www.springbank.com/schema/springbank.xsd"> <!-- 新建客户 -->
<sb:transaction id="CreateOwner" action="CreateOwnerAction" template="TransTemplate"></sb:transaction>
</beans>
2.可以看到上面的xsd文件是一个web地址,我现在自然没有这个东东,所以要在spring.schemas这个文件中映射本地位置,而这个文件必须要放在CLASSPATH:META-INF下面
http\://www.springbank.com/schema/springbank.xsd=com/springbank/test/example/mytag/springbank.xsd
但实际上可能是IDE比较傻,每次validate都会说找不到,但实际上运行起来的时候是能证明它是被找到的
3.需要向spring注册我们的标签,和标签解析器,我们的标签。固定的套路,代码如下:
public class SpringbankNamespaceHandlerSupport extends NamespaceHandlerSupport{
private final Logger log = LoggerFactory.getLogger(getClass());
@Override
public void init() {
registerBeanDefinitionParser("transaction", new TagTransactionBeanDefinitionParser());
}
}
其中TagTransactionBeanDefinitionParser如下
public class TagTransactionBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {
private final Logger log = LoggerFactory.getLogger(getClass()); @Override
protected Class<?> getBeanClass(Element element) {
return Transaction.class;
}
protected void doParse(Element element, BeanDefinitionBuilder bean) {
String id = element.getAttribute("id");
String action = element.getAttribute("action");
String template = element.getAttribute("template"); if (StringUtils.hasText(id)) {
bean.addPropertyValue("id", id);
}
if (StringUtils.hasText(action)) {
bean.addPropertyValue("action", action);
}
if (StringUtils.hasText(template)) {
bean.addPropertyValue("template", template);
}
}
}
最后是我的测试类:
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("com/springbank/test/example/mytag/applicationContext.xml");
Transaction transaction = (Transaction)context.getBean("CreateOwner");
System.out.println(transaction.getTemplate());
}
输出:
Jul 11, 2017 3:57:22 PM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@49c2faae: startup date [Tue Jul 11 15:57:22 CST 2017]; root of context hierarchy
Jul 11, 2017 3:57:22 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [com/springbank/test/example/mytag/applicationContext.xml]
Bean Transaction have been created: Transaction [id=null, template=null]
TransTemplate
做法就是这样的做法,但是如果我要搞一个<sb:annotation-driven>,又改怎么办呢?所以只知道做法就没有办法举一反三,必须要知道原理,所以我先来研究上面的原理,主要是为什么我自己定义的SpringbankNamespaceHandlerSupport 能够工作
我是new了一个ClassPathXmlApplicationContext,然后看它一步一步怎么处理。
在BeanDefinitionParserDelegate类中:
public BeanDefinition parseCustomElement(Element ele, BeanDefinition containingBd) {
String namespaceUri = getNamespaceURI(ele);
NamespaceHandler handler = this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri);
if (handler == null) {
error("Unable to locate Spring NamespaceHandler for XML schema namespace [" + namespaceUri + "]", ele);
return null;
}
return handler.parse(ele, new ParserContext(this.readerContext, this, containingBd));
}
经过调试可以看到:
另一方面我发现在
org.springframework.context.annotation.ConfigurationClassParser
里面有doProcessConfigurationClass这个方法,对一些注解进行了了处理。这里我还没有看懂
另一方面,根据开头那边文章里的知识在ComponentScanBeanDefinitionParser类里的parse方法对
<context:component-scan base-package="com.xxx" />
进行了处理
所以我有了一个想法,就是我搞的<sb:annotation-dvriven/>我也搞这样一个parser去处理,扫描指定的包下面的信息,然后放到一个list中,当请求来的时候,根据交易类型,去遍历这个list
springbank 开发日志 Spring启动过程中对自定义标签的处理的更多相关文章
- 死磕Spring之IoC篇 - 解析自定义标签(XML 文件)
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...
- Windows平台下Oracle实例启动过程中日志输出
Windows平台下Oracle实例启动过程中日志输出记录. 路径:D:\app\Administrator\diag\rdbms\orcl\orcl\trace\alert_orcl.log 输出内 ...
- Windows平台下Oracle监听服务启动过程中日志输出
Windows平台下Oracle监听服务启动过程中日志输出记录. 日志目录:D:\app\Administrator\diag\tnslsnr\WIN-RU03CB21QGA\listener\tra ...
- 嵌入式Linux启动过程中的问题积累
嵌入式Linux启动过程中的问题积累 Dongas 07-12-19 1.Bad Magic Number ## Booting image at 33000000 ... Bad Magic Num ...
- 【ARM-Linux开发】U-Boot启动过程--详细版的完全分析
---------------------------------------------------------------------------------------------------- ...
- hive配置以及在启动过程中出现的问题
一.hive配置 1.安装环境 在hadoop-1.2.1集群上安装hive-1.2.1 2.将hive-1.2.1环境变量添加到PATH路径下 使用如下命令打开配置文件 nano /etc/prof ...
- 转:Tomcat启动过程中找不到JAVA_HOME JRE_HOME的解决方法
转自:http://blog.sina.com.cn/s/blog_61c006ea0100l1u6.html 原文: 在XP上明明已经安装了JDK1.5并设置好了JAVA_HOME,可偏偏Tomca ...
- Tomcat启动过程中找不到JAVA_HOME解决方法
在XP上明明已经安装了JDK1.5并设置好了JAVA_HOME,可偏偏Tomcat在启动过程中找不到. 报错信息如下:Neither the JAVA_HOME nor the JRE_HOME en ...
- 开发与测试整体过程中的Git分支merge流程
开发与测试整体过程中的Git分支merge流程 Git分支merge之开发流程 首先在Gitlab上有个仓库存储着原始的项目代码,其中包含一个叫master的分支.然后可能按功能进行分配,由不同的开发 ...
随机推荐
- JavaScript常用函数总结
1.test()方法 var str = "wzltestreg"; var reg = new RegExp("wzl", ""); al ...
- 如何使用Ajax从FastReport Web API获取报表
在文章“如何在ASP.NET Web API中使用FastReport.Net”中,我们已经讨论了如何创建一个用于生成报表的Web服务.然后我们会收到报表的链接,现在我们来看看如何获取报表并使用a ...
- 10 SpringBoot全面接管SpringMVC
Spring Boot官方文档描述 If you want to keep Spring Boot MVC features and you want to add additional MVC co ...
- 未能加载文件或程序集System.Web.Http.WebHost
解决方案:只需要在项目的bin文件夹下放入下面三个dll. 将:C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 4\Assemblies中的 ...
- JS结合a标签的使用
a标签可以当作按钮使用,也可以当作连接. <a href=javascript:test(5)>弹出5</a> 会直接调用JS函数(注意中间没引号) <a href ...
- Jetson tk1 安装 usbtoserials 驱动(重新刷机)
一.tk1驱动包,文件系统和源码下载 截止2016年9月1号,tk1最版本为R21.5. (以下三个文件放在同一个文件夹下) 1.driver package(驱动包,相当于安装程序) https:/ ...
- ubuntu 14.04界面美化
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABVYAAAMACAIAAABAXKuVAAAAA3NCSVQICAjb4U/gAAAgAElEQVR4Xu
- UML和模式应用4:初始阶段(6)--迭代方法中如何使用用例
1.前言 用例是UP和其他众多迭代方法的核心.UP提倡用例驱动开发. 2. 迭代方法中如何使用用例 功能需求首先定义在用例中 用例是迭代计划的重要部分,迭代是通过选择一些用例场景或整个用例来定义的 用 ...
- python3爬虫中文乱码之请求头‘Accept-Encoding’:br 的问题
当用python3做爬虫的时候,一些网站为了防爬虫会设置一些检查机制,这时我们就需要添加请求头,伪装成浏览器正常访问. header的内容在浏览器的开发者工具中便可看到,将这些信息添加到我们的爬虫代码 ...
- System.Runtime.InteropServices.COMException (0x800A03EC): 无法访问文件
使用Microsoft.Office.Interop.Excel 操作 今天在服务器部署,操作程序csv文件转xsl文件的时候,遇到一下问题: System.Runtime.InteropServic ...