基于Spring自定义标签

基于Spring自定义标签

需求:基于Spring自定义标签,实现通过Bean方式来统一时间格式,避免在开发中不同开发者使用的时间格式不一致导致系统难以维护。自定义标签方式如下:

1. 核心配置文件位置如下:

2. 核心配置内容如下:

huhx.xsd

<?xml version="1.0" encoding="UTF-8"?>
<!-- xmlns="http://www.huhx.com/schema/ch"  -->
<xsd:schema xmlns="http://www.huhx.com/schema/ch"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:beans="http://www.springframework.org/schema/beans"
            targetNamespace="http://www.huhx.com/schema/ch"
            elementFormDefault="qualified"
            attributeFormDefault="unqualified">

    <xsd:import namespace="http://www.springframework.org/schema/beans" />

	<!-- 
		xsd:element     表示定义标签  
		xsd:extension  如java中的继承,把现有的定义继承进来  
		xsd:attribute    标签带有的属性  
		xsd:complexType 元素定义复杂类型
		xsd:complexContent 元素定义对复杂类型(包含混合内容或仅包含元素)的扩展或限制。
	-->
    <xsd:element name="dateformat">
        <xsd:complexType>
            <xsd:complexContent>
            	<!-- 继承定义 从namespace="http://www.springframework.org/schema/beans" -->
                <xsd:extension base="beans:identifiedType">
                    <xsd:attribute name="lenient" type="xsd:boolean"/>
                    <xsd:attribute name="pattern" type="xsd:string" use="required"/>
                </xsd:extension>
            </xsd:complexContent>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

spring.handlers

http\://www.huhx.com/schema/ch=cn.edu.his.pay.handler.MyNamespaceHandler

spring.schemas

http\://www.huhx.com/schema/ch.xsd=META-INF/huhx.xsd

MyNamespaceHandler.java

package cn.edu.his.pay.handler;

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

public class MyNamespaceHandler extends NamespaceHandlerSupport {
    @Override
    public void init() {
        registerBeanDefinitionParser("dateformat", new SimpleDateFormatBeanDefinitionParser());
    }
}

SimpleDateFormatBeanDefinitionParser.java

package cn.edu.his.pay.handler;

import java.text.SimpleDateFormat;

import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.springframework.util.StringUtils;
import org.w3c.dom.Element;

public class SimpleDateFormatBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {

    protected Class getBeanClass(Element element) {
        return SimpleDateFormat.class;
    }

    protected void doParse(Element element, BeanDefinitionBuilder bean) {
        String pattern = element.getAttribute("pattern");
        bean.addConstructorArgValue(pattern);

        String lenient = element.getAttribute("lenient");
        if (StringUtils.hasText(lenient)) {
            bean.addPropertyValue("lenient", Boolean.valueOf(lenient));
        }
    }
}

spring-dispatcher.xml 标签使用代码(核心部分)

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:task="http://www.springframework.org/schema/task" xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:util="http://www.springframework.org/schema/util" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:jpa="http://www.springframework.org/schema/data/jpa"
	xmlns:ch="http://www.huhx.com/schema/ch"
	xsi:schemaLocation="
	http://www.springframework.org/schema/util
	http://www.springframework.org/schema/util/spring-util-4.0.xsd
	http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
	http://www.springframework.org/schema/context 
	http://www.springframework.org/schema/context/spring-context-4.0.xsd
	http://www.springframework.org/schema/mvc
	http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
	http://www.springframework.org/schema/aop 
	http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
	http://www.springframework.org/schema/jdbc 
	http://www.springframework.org/schema/jdbc/spring-jdbc-4.0.xsd
	http://www.springframework.org/schema/tx 
	http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
	http://www.springframework.org/schema/data/jpa 
	http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
	http://www.springframework.org/schema/task 
	http://www.springframework.org/schema/task/spring-task-3.0.xsd
	http://www.huhx.com/schema/ch
	http://www.huhx.com/schema/ch.xsd">
	
	<ch:dateformat id="dateFormat" pattern="yyyy-MM-dd HH:mm" lenient="true"/>
</beans>

测试代码如下:

package cn.edu.his.pay.handler;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("spring/spring-dispatcher.xml");
		SimpleDateFormat info = (SimpleDateFormat) context.getBean("dateFormat");

		System.out.println("自定义的dateFormat:"+info.format(new Date()));
		System.out.println("系统的dateFormat:"+new SimpleDateFormat().format(new Date()));
		
		/*
		自定义的dateFormat:2018-05-08 12:38
		系统的dateFormat:18-5-8 下午12:38
		*/
	}
}
@Controller
public class DateformatController {
	
	@Autowired
	@Qualifier("dateFormat")
	private SimpleDateFormat date;
	
	@ResponseBody
	@RequestMapping("/date")
	public String date(){
		return date.format(new Date());
	}
}

4. 总结

通过上面自定义标签的实现,这样我们可以在xml定义不同格式的Bean,通过Bean注入的方式来复用功能代码。只要涉及到代码复用或代码重构,我们也可以考虑使用这种基于xml标签配置方式来做。这里列举的方式比较简单,但不是重点,重点是在对于Spring的架构的扩展机制更加深入的理解。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏肖蕾的博客

OKHttp3(支持Retrofit)的网络数据缓存Interceptor拦截器

3593
来自专栏JadePeng的技术博客

Docker+Jenkins持续集成环境(5): android构建与apk发布

项目组除了常规的java项目,还有不少android项目,如何使用jenkins来实现自动构建呢?本文会介绍安卓项目通过jenkins构建的方法,并设计开发一个...

5048
来自专栏腾讯大讲堂的专栏

深入浅出 Retrofit,这么牛逼的框架你们还不来看看?

文章来源:腾讯Bugly Android 开发中,从原生的 HttpUrlConnection 到经典的 Apache 的 HttpClient,再到对前面这些...

3065
来自专栏潇涧技术专栏

Pury Project Analysis

Pury的源码:https://github.com/NikitaKozlov/Pury

912
来自专栏刘望舒

Android深入四大组件(一)应用程序启动过程

前言 在此前的文章中,我讲过了Android系统启动流程和Android应用进程启动过程,这一篇顺理成章来学习Android 7.0的应用程序的启动过程。分析应...

2867
来自专栏刘望舒

Android资源动态加载以及相关原理分析

思考 一般情况下,我们在设计一个插件化框架的时候,要解决的无非是下面几个问题: 四大组件的动态注册 组件相关的类的加载 资源的动态加载 实际上从目前的主流插件...

3278
来自专栏MasiMaro 的技术博文

hook键盘驱动中的分发函数实现键盘输入数据的拦截

我自己在看《寒江独钓》这本书的时候,书中除了给出了利用过滤的方式来拦截键盘数据之外,也提到了另外一种方法,就是hook键盘分发函数,将它替换成我们自己的,然后再...

962
来自专栏Java开发者杂谈

XSS事件(一)

​ 最近做的一个项目因为安全审计需要,需要做安全改造。其中自然就包括XSS和CSRF漏洞安全整改。关于这两个网络安全漏洞的详细说明,可以参照我本篇博客最后的参考...

1864
来自专栏技术记录

前端插件——头像截图上传插件的使用(带后台)

效果图:实现上传头像,右边是预览,有三个大小,可以对头像进行裁剪 ? HTML: toParentData 和 img 返回的是图片裁剪后的base64编码。其...

1.1K5
来自专栏Java与Android技术栈

用kotlin打印出漂亮的android日志写在最后

Kotlin号称是Android版本的swift,距离它1.0正式版本的推出快一年了。它像swift一样,可以写客户端也可以写服务端。由于公司项目比较繁忙,我一...

1282

扫码关注云+社区

领取腾讯云代金券