在前文《Spring Schema》中讲述了如何使用Spring Ext功能,但并未具体讲其内如原理。本篇进行一些补充。
要研究spring ext的实现原理就需要研究下解析xml文件生成相应的BeanDefination的过程了。下面的类图是与load BeanDefinition相关的主要的类:
![](http://dl.iteye.com/upload/attachment/297672/9b096146-6288-388c-9029-507b77f55554.jpg)
<!--[endif]-->
其中与Spring EXT相关的主要是NamespaceHandlerResolver和ResourceEntityResolver两个类。
ResourceEntityResolver类由BeansDtdResolver和PluggableSchemaResolver组成,用以在classpath下搜寻schema和DTD文件。而其中的PluggableSchemaResolver有一个schemaMappingsLocation属性其值为写死的META-INF/spring.schemas,这就找到了我们上面第四步里写的spring.schemas文件了。PluggableSchemaResolver把扫描到的schema存储在属性Map<String,
String> schemaMappings中。除了在spring.schemas中自定义的schema外,PluggableSchemaResolver还会自动将spring默认的schema也扫面进来。例如:
{http://www.springframework.org/schema/lang/spring-lang-3.0.xsd=org/springframework/scripting/config/spring-lang-3.0.xsd,
http://www.example.org/mydateformat/mydateformat.xsd=com/ronry/springtest/schema/mydateformat.xsd,
http://www.springframework.org/schema/lang/spring-lang-2.5.xsd=org/springframework/scripting/config/spring-lang-2.5.xsd,
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd=org/springframework/aop/config/spring-aop-2.0.xsd,
http://www.springframework.org/schema/lang/spring-lang-2.0.xsd=org/springframework/scripting/config/spring-lang-2.0.xsd,
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd=org/springframework/aop/config/spring-aop-2.5.xsd,
http://www.springframework.org/schema/task/spring-task.xsd=org/springframework/scheduling/config/spring-task-3.0.xsd,
http://www.springframework.org/schema/jee/spring-jee.xsd=org/springframework/ejb/config/spring-jee-3.0.xsd}
(省略大部)
类似,DefaultNamespaceHandlerResolver中也有一个属性handlerMappingsLocation其默认值为META-INF/spring.handlers,这也是我们第四步骤定义的文件。也同样有一个属性handlerMappings存储了namespace对应的handler,例如:
{http://www.example.org/mydateformat=com.ronry.springtest.schema.MyNamespaceHandler,
http://www.springframework.org/schema/aop=org.springframework.aop.config.AopNamespaceHandler,
http://www.springframework.org/schema/util=org.springframework.beans.factory.xml.UtilNamespaceHandler,
http://www.springframework.org/schema/p=org.springframework.beans.factory.xml.SimplePropertyNamespaceHandler,
http://www.springframework.org/schema/task=org.springframework.scheduling.config.TaskNamespaceHandler,
http://www.springframework.org/schema/lang=org.springframework.scripting.config.LangNamespaceHandler,
http://www.springframework.org/schema/context=org.springframework.context.config.ContextNamespaceHandler,
http://www.springframework.org/schema/jee=org.springframework.ejb.config.JeeNamespaceHandler}
这其中也已经包括了自定义的handler和spring默认的一些handler。
有了这些信息后,在解析bean定义的xml文件时,当遇到非默认命名空间(beans)的元素时,就按如下过程进行解析:
-
从元素中解析出nameSpaceUri;
-
根据nameSpaceUri,从DefaultNamespaceHandlerResolver中获取其对应的Handler加载Handler并 调用其init()方法;我们实现的MyNamespaceHandler在其inti()方法中注册了dataFormat标签的parser;
-
调用handler的parser方法解析元素,具体又分为以下几步:
1) 查找元素名对应的parser;
2)调用找到的parser的parse()方法;
详细的解析过程如下图:
![](http://dl.iteye.com/upload/attachment/297675/94085894-21c2-329e-9d28-47153b8cdabe.jpg)
<!--[endif]-->
另外,还有一点想说的是BeanDefinitionParser的继承体系。自定的BeanDefinitionParser一般继承自AbstractSingleBeanDefinitionParser,其又继承自AbstractBeanDefinitionParser,如图:
![](http://dl.iteye.com/upload/attachment/297677/74569863-ecff-36ab-b296-208c42282171.jpg)
<!--[endif]-->
这个继承体系充分使用了模板方法的设计模式。调用时,会调用AbstractBeanDefinitionParser的parse()方法,这也是BeanDefinitionParser接口定义的方法。parse()方法中调用parseInternal()方法,而该方法在AbstractBeanDefinitionParser只是个抽象方法,具体定义只有在AbstractSingleBeanDefinitionParser中才有。AbstractSingleBeanDefinitionParser的parseInternal方法又会调用getBeanClass()和doParse()方法,这两个在AbstractSingleBeanDefinitionParser也都是抽象方法(或者是return
null的方法),需要在定义的Parser中覆盖。
![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0029/7672/9b096146-6288-388c-9029-507b77f55554-thumb.jpg)
- 大小: 53 KB
![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0029/7675/94085894-21c2-329e-9d28-47153b8cdabe-thumb.jpg)
- 大小: 65 KB
![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0029/7677/74569863-ecff-36ab-b296-208c42282171-thumb.jpg)
- 大小: 42 KB
分享到:
相关推荐
本示例代码“扩展Spring schema样例代码 maven”旨在介绍如何在Spring框架中扩展自定义的schema,以及如何在一个Maven项目中整合这些扩展。 首先,让我们深入理解Spring Schema扩展的概念。Spring Schema是Spring ...
标题“spring schema”涉及到的是Spring框架中的XML Schema配置,这是Spring框架早期常用的一种配置方式,用于定义和管理Bean的生命周期和依赖关系。Spring XML Schema提供了一种结构化的、可读性更强的方式来替代纯...
以下是关于“spring framework schema”及其相关标签“springschema”的详细知识点: 1. **Schema**: 在Spring Framework中,schema是一种XML配置方式,用于定义bean的行为和依赖关系。例如,`jdbc`、`jms`、`cache...
Spring 4.0 Schema是Spring框架的一个重要组成部分,它定义了Spring配置文件的结构和语义,使得开发者可以通过XML配置来声明式地管理应用程序的组件和依赖关系。在这个压缩包中,包含了多个子目录,每个目录对应...
2. **注册Schema**: 在Spring的配置文件中,引入自定义的Schema,以便Spring能够识别并解析这些自定义元素。这通常通过在XML文件头部添加`<xs:schemaLocation>`属性来完成。 ```xml <beans xmlns="http://www....
《Spring Framework 4.2.5 Schema 深度解析》 Spring Framework 是一个全面的Java应用程序开发框架,以其模块化、灵活性和强大的功能而备受赞誉。在4.2.5版本中,Spring引入了对各种XML Schema的支持,极大地简化了...
《Spring Framework 4.2.4.RELEASE:深入解析Schema》 Spring Framework是Java平台上的一个核心企业级应用框架,以其模块化、可扩展性和强大的功能而闻名。4.2.4.RELEASE版本是该框架的一个重要里程碑,它带来了...
本次我们聚焦于"spring-5.2.9.RELEASE-schema.zip"压缩包,通过其包含的子文件,深入探讨Spring 5.2.9版本的关键概念和组件。 1. **Mvc(Model-View-Controller)模块**: Spring MVC是Spring框架的一个重要组成...
《Spring Framework 4.3.4.RELEASE Schema详解》 Spring Framework是Java开发中的一个核心框架,它为创建高效、灵活且可测试的Java应用程序提供了强大的支持。在4.3.4.RELEASE版本中,Spring引入了对XML Schema的...
2. **Schema定义**:Spring的schema是一组预定义的规则,用于验证XML配置文件中的元素和属性。这些规则在Spring的JAR文件中以`.xsd`(XML Schema Definition)文件的形式存在,例如`spring-beans.xsd`、`spring-...
2. **beans**: `beans`目录下的Schema文件是Spring的核心,它定义了如何声明和管理Bean的规则。例如,元素、元素等,用于定义类实例化、依赖注入以及属性设置。 3. **jdbc**: JDBC模块提供了数据库访问的抽象层,...
在使用Spring,写核心配置文件的时候都引入了不一样的约束,这里总结关于spring的XML约束+Schema约束。以后不管是仅使用ioc功能还是aop,把全部的约束引入即可。至于说如何找到这些约束的代码的过程,也在这个文档...
本篇文章将深入探讨Spring AOP的Schema实现,即基于XML配置的方式来理解和应用AOP。 一、Spring AOP基础概念 1. 切面(Aspect):切面是关注点的模块化,例如日志、事务管理。在Spring AOP中,切面由通知(Advice...
2. **AOP(面向切面编程)**:Spring提供了AOP支持,允许开发者定义拦截器来实现跨切面的关注点,如日志记录、事务管理等。 3. **数据访问集成**:Spring支持多种数据访问技术,如JDBC、ORM(对象关系映射)框架如...
2. **jdbc**:这部分内容涉及Spring对Java数据库连接(JDBC)的支持。Spring通过提供JdbcTemplate和NamedParameterJdbcTemplate等工具类,简化了JDBC操作,提高了代码的可读性和可测试性。XML Schema定义了如何配置...
Spring致力于J2EE应用的各层的解决方案,而不是仅仅专注于某一层的方案。可以说Spring是企业应用开发的“一站式”选择,并贯穿表现层、业务层及持久层。然而,Spring并不想取代那些已有的框架,而是与它们无缝地整合...
《Spring Framework 4.1.6.RELEASE Schema详解》 Spring Framework是Java开发中的核心框架,它为构建高质量、可维护、可扩展的应用程序提供了全面的解决方案。在4.1.6.RELEASE版本中,Spring引入了对XML Schema的...
2. **模块化**:自定义Schema可以帮助将特定功能封装成独立的模块,减少核心配置的复杂度。 3. **灵活性**:通过自定义Schema,可以轻松添加新的配置选项,适应项目的演进需求。 总结来说,Spring自定义配置Schema...
这个压缩包“spring-framework-5.0.1.RELEASE-schema.zip”包含了与Spring框架相关的XML约束文件,这些文件定义了配置文件中的元素和属性,确保了正确和一致的配置。 1. **mvc** - 这部分涉及到Spring MVC(Model-...
05. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 06. ...