文档章节

spring 自定义schema

明舞
 明舞
发布于 2015/07/02 14:42
字数 535
阅读 18
收藏 0

扩展schema,定义自己的bean属性。。不错!

主要:

1,定义META-INF下.xsd文件,这里是people.xsd;定义spring.handlers;定义spring.schemas

2,定义namaspace解析类,这里是StudentNamespaceHandler

3,定义beanDefinition,这里是StudentBeanDefinitionParser

4,当然还有相关的javabean定义,这里是Student.java

详细代码:

people.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns="http://www.luyee.com/bat/schema/people"
	xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
	xmlns:beans="http://www.springframework.org/schema/beans"
	targetNamespace="http://www.luyee.com/bat/schema/people"
	elementFormDefault="qualified" 
	attributeFormDefault="unqualified">
    <xsd:import namespace="http://www.springframework.org/schema/beans" />
    
	<xsd:element name="student">
	 <xsd:complexType>  
            <xsd:complexContent>  
                <xsd:extension base="beans:identifiedType"> 
                 
                   	<xsd:attribute name="name"
						type="xsd:string">
						<xsd:annotation>
							<xsd:documentation>
								姓名 
							</xsd:documentation>
						</xsd:annotation>
					</xsd:attribute> 
					 
                   	<xsd:attribute name="age"
						type="xsd:string">
						<xsd:annotation>
							<xsd:documentation>
								年龄
							</xsd:documentation>
						</xsd:annotation>
					</xsd:attribute>  
                   
                </xsd:extension>  
            </xsd:complexContent>  
        </xsd:complexType>  
    </xsd:element>  
   </xsd:schema>
spring.handlers;

http\://www.luyee.com/bat/schema/people=com.luyee.bat.spring.StudentNamespaceHandler
spring.schemas

http\://www.luyee.com/bat/schema/people.xsd=META-INF/people.xsd


StudentNamespaceHandler和StudentBeanDefinitionParser

package com.luyee.bat.spring;

import java.text.SimpleDateFormat;

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

public class StudentNamespaceHandler  extends NamespaceHandlerSupport {

	public void init() {
		registerBeanDefinitionParser("student", new StudentBeanDefinitionParser());  
	}
	
	class StudentBeanDefinitionParser extends AbstractSingleBeanDefinitionParser{
		 protected Class getBeanClass(Element element) {  
		        return Student.class;  
		    }  
		  
		    protected void doParse(Element element, BeanDefinitionBuilder bean) {  
		        String name = element.getAttribute("name");  
		        bean.addPropertyValue("name", name);  

		        String age = element.getAttribute("age");  
		        if (StringUtils.hasText(age)) {  
		            bean.addPropertyValue("age", Integer.valueOf(age));  
		        }  
		    }  
	}
}
JavaBean:Student

package com.luyee.bat.spring;

public class Student {
	
	private String name;
	
	private int age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
	

}

测试:applicationContex.xml(people:student就好比bean)

<?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:people="http://www.luyee.com/bat/schema/people"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd  
    http://www.luyee.com/bat/schema/people http://www.luyee.com/bat/schema/people.xsd" >  
    <people:student id="student1" name="student1"  
        age="18" />  
        
    <people:student id="student2" name="student2"  
        age="20" />  
  
</beans>
StudentXsdTest.java

package com.luyee.bat.spring;

  
import org.springframework.context.ApplicationContext;  
import org.springframework.context.support.ClassPathXmlApplicationContext;  
  
public class StudentXsdTest {  
  
    public static void main(String[] args) {  
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");  
        Student student1 = (Student) ctx.getBean("student1");  
        Student student2 = (Student) ctx.getBean("student2");  
        System.out.println("name: " +student1.getName()+" age :" + student1.getAge());  
        System.out.println("name: " +student2.getName()+" age :" + student2.getAge());  
    }  
}

输出:

八月 13, 2013 8:50:50 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@46f7ba12: startup date [Tue Aug 13 20:50:50 CST 2013]; root of context hierarchy
八月 13, 2013 8:50:50 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
八月 13, 2013 8:50:52 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@25e9a396: defining beans [student1,student2]; root of factory hierarchy
name: student1 age :18
name: student2 age :20

最后贴个文件结构


版权声明:本文为博主原创文章,未经博主允许不得转载。

© 著作权归作者所有

明舞
粉丝 231
博文 424
码字总数 516555
作品 0
程序员
私信 提问
spring-基于可扩展Schema的特性自定义标签

引言 从spring 2.0开始,spring开始支持基于schema的bean的配置和定义,即通过标签定义和配置bean交由spring容器管理,它和通过spring的标签定义bean是相同的,但对于用户更透明和友好。 例如...

细肉云吞
2017/04/13
185
0
携程大佬带你写一个可扩展的Spring插件

# 背景介绍 Spring现在几乎已经成为了Java开发的必备框架,在享受Spring框架本身强大能力的同时,有时我们也会希望自己研发的组件和Spring进行整合,从而使得组件更易于上手,而且配合Sprin...

Java架构师CAT
08/16
0
0
Dubbo源码-Dubbo是如何随心所欲自定义XML标签的

叨叨 今天考虑了很久要不要写这篇文章。 距离《Dubbo源码》系列的开篇到现在已经快两个月时间了。当时是想着工作上的RPC框架使用存在一些让人头疼的问题,就来看看Dubbo给出了一套什么样的解...

Jackie_Zheng
2018/05/20
0
0
刷新页面时为啥会调用shiro框架SessionDao的delete方法

环境SpringMVC Spring mybatis shiro 重写了shiro的sessionDao 。问题是在使用F5 刷新页面时程序会调用SessionDao的delete方法。为什么会调用这个方法?如何修改? /user/login.do=anon /use...

李树林
2016/08/29
418
0
《Spring Security3》第四章第一部分翻译上(数据库管理信息)

第四章 凭证安全存储 到现在为止,我们已经将JBCP Pets站点做了一些用户友好性方面的升级,包括一个自定义的登录页、修改密码以及remember me功能。 在本章中,我们将会把到目前为止都在使用...

heroShane
2014/02/08
96
0

没有更多内容

加载失败,请刷新页面

加载更多

代理模式之JDK动态代理 — “JDK Dynamic Proxy“

动态代理的原理是什么? 所谓的动态代理,他是一个代理机制,代理机制可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成,通过代理可以有效的让调...

code-ortaerc
今天
5
0
学习记录(day05-标签操作、属性绑定、语句控制、数据绑定、事件绑定、案例用户登录)

[TOC] 1.1.1标签操作v-text&v-html v-text:会把data中绑定的数据值原样输出。 v-html:会把data中值输出,且会自动解析html代码 <!--可以将指定的内容显示到标签体中--><标签 v-text=""></......

庭前云落
今天
8
0
VMware vSphere的两种RDM磁盘

在VMware vSphere vCenter中创建虚拟机时,可以添加一种叫RDM的磁盘。 RDM - Raw Device Mapping,原始设备映射,那么,RDM磁盘是不是就可以称作为“原始设备映射磁盘”呢?这也是一种可以热...

大别阿郎
今天
12
0
【AngularJS学习笔记】02 小杂烩及学习总结

本文转载于:专业的前端网站☞【AngularJS学习笔记】02 小杂烩及学习总结 表格示例 <div ng-app="myApp" ng-controller="customersCtrl"> <table> <tr ng-repeat="x in names | orderBy ......

前端老手
昨天
16
0
Linux 内核的五大创新

在科技行业,创新这个词几乎和革命一样到处泛滥,所以很难将那些夸张的东西与真正令人振奋的东西区分开来。Linux内核被称为创新,但它又被称为现代计算中最大的奇迹,一个微观世界中的庞然大...

阮鹏
昨天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部