Spring自定义命名空间提供了一种很好的方式来简化用于描述Spring应用程序上下文的bean定义的xml文件。 这是一个相当古老的概念,最初是在Spring 2.0中引入的,但值得不时地进行审查。

考虑一种情况,必须为没有自定义名称空间的Spring MVC应用程序配置部分Bean –通常看起来像这样:

<bean name="handlerAdapter" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"><property name="webBindingInitializer"><bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"><property name="conversionService" ref="conversionService"></property><property name="validator"><bean class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/></property></bean></property><property name="messageConverters"><list><bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"></bean><bean class="org.springframework.http.converter.StringHttpMessageConverter"></bean><bean class="org.springframework.http.converter.ResourceHttpMessageConverter"></bean><bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"></bean><bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"></bean><bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"></bean><bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean></list></property>
</bean><bean name="handlerMapping" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"><property name="useSuffixPatternMatch" value="false"></property>
</bean>

在这里,它配置了两个bean –一个用来处理MVC控制器流的handlerAdapter和一个用来保持请求URI与Controller方法之间的映射以处理请求的handlerMapping。

自定义命名空间“ http://www.springframework.org/schema/mvc”的相同配置变得非常简洁,通常给其命名空间前缀为“ mvc”:

<mvc:annotation-driven conversion-service="conversionService">
</mvc:annotation-driven>

本质上,这是使用Custom名称空间的优势–一种非常简洁的方式来描述Spring bean定义

那么自定义名称空间的工作原理是:

Spring Reference文档中的这一节比我能更好地描述它– http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/extensible-xml.html#extensible-xml -模式。 概括起来,自定义名称空间包含四个部分:

  • 模式 -描述自定义名称空间的结构-标记名称,属性,子标记等。
  • 一个NamespaceHandler –为xml元素创建bean定义。 但是,通常由Spring文档建议的更好的机制是扩展NameSpaceHandlerSupport并为Custom命名空间所支持的不同xml元素注册一系列BeanDefinitionParser (例如,注解驱动的mvc命名空间的拦截器元素)。
  • BeanDefinitionParser –为特定元素创建bean定义–在这里,像<mvc:annotation-driven />这样的行将扩展为具有实际bean类名的更广泛的bean定义。
  • 注册架构,NamespaceHandler -用于Spring查找自定义名称空间的架构,并找到将处理自定义名称空间的NamespaceHandler。 模式的注册是通过一个名为META-INF / spring.schemas的文件完成的,这是Spring在类路径中找到模式而不是通过Web下载模式的一种好方法。 NamespaceHandler使用META-INF / spring.handlers文件进一步指定,并包含将处理自定义名称空间的NamespaceHandler名称,例如。 从Spring文档–
http\://www.mycompany.com/schema/myns=org.springframework.samples.xml.MyNamespaceHandler

绑在一起

有关自定义名称空间内部工作方式的信息可以很好地理解一些自定义namepsace标记的行为。 考虑一个标签来加载属性文件:

<context:property-placeholder location="classpath*:META-INF/spring/database.properties"/>

因此,要查找property-placeholder元素在内部如何工作,请首先找到spring.handlers文件。 由于property-placeholder位于上下文命名空间中,因此spring.conler.s文件将出现在spring-context.jar文件中

文件指示NamespaceHandler为org.springframework.context.config.ContextNamespaceHandler

ContextNameSpaceHandler注册了一个名为org.springframework.context.config.PropertyPlaceholderBeanDefinitionParser的BeanDefinition解析器。 此BeanDefinitionParser创建一个类定义为“ PropertyPlaceholderConfigurer ”的bean定义,因此从本质上讲,我们可以替换为:
<context:property-placeholder location="classpath*:META-INF/spring/database.properties" local-override="true" properties-ref="localProperties"/>

在过程中却变得简明扼要–

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="location" value="classpath*:META-INF/spring/database.properties"></property><property name="localOverride" value="true"></property><property name="properties"><ref bean="localProperties"/></property>
</bean>

但是,这提供了一种很好的方式来理解Spring如何处理自定义命名空间下的某些细微差别。

参考: all和其他博客中来自JCG合作伙伴 Biju Kunjummen的Spring Custom Namespaces 。

翻译自: https://www.javacodegeeks.com/2012/07/spring-custom-namespaces.html

Spring自定义命名空间相关推荐

  1. Spring自定义命名空间的解析原理与实现

    Spring自定义命名空间的解析原理与实现 原理 由上篇文章refresh() -> obtainFreshBeanFactory()跟踪源码可知Spring在解析除默认命名空间import.a ...

  2. spring自定义标签实现

    http://mozhenghua.iteye.com/blog/1830842 spring中编写配置可以用两种方式: 普通的通过 <bean id="" class=&q ...

  3. spring 自定义标签的实现

    在我们进行Spring 框架开发中,估计用到最多的就是bean 标签吧,其实在Spring中像<mvc/><context/>这类标签以及在dubbo配置的标签都是属于自定义的 ...

  4. spring 自定义日志_Spring和Hibernate的自定义审核日志

    spring 自定义日志 如果您需要对所有数据库操作进行自动审核 ,并且正在使用Hibernate-,则应使用Envers或spring data jpa auditing . 但是,如果由于某些原因 ...

  5. zf2 加载自定义命名空间

    当需要在控制器重加载自定义的命名空间需要 Zend\Loader\StandardAutoloader 去注册命名空间对应的目录. 比如结构如下 zf2 -----config -----core(自 ...

  6. Spring自定义标签使用及原理

    最近大半年一直在看spring的源码,寻思着需要写点什么,也锻炼下自己文档编写的能力.本篇我们讲解spring自定义标签的使用及原理,分为以下小节进行讲解. 自定义标签的用途 自定义标签使用 自定义标 ...

  7. Spring自定义注解

    转载自:Spring自定义注解 前言 自定义注解在开发中是一把利器,经常会被使用到.在上一篇文章中有提到了自定义校验注解的用法. 然而最近接到这样一个需求,主要是针对某些接口的返回数据需要进行一个加密 ...

  8. return error怎么定义_这一次搞懂Spring自定义标签以及注解解析原理

    自定义标签解析原理 在上一篇分析默认标签解析时看到过这个类DefaultBeanDefinitionDocumentReader的方法parseBeanDefinitions:拉勾IT课小编为大家分解 ...

  9. spring 自定义标签 学习

    自定义配置文件到spring 中,有时候想做一些数据结构的配置化信息,根据业务做一个扩展. 首先: 在项目的META-INF目录下新建两个文件spring.handlers,和spring.shcem ...

最新文章

  1. nginx 反向代理,动静态请求分离,proxy_cache缓存及缓存清除
  2. 【modbus】libmodbus库的移植与使用
  3. hdu1518 bjfuoj1042 zoj1909 poj2362 经典的搜索加剪枝
  4. 深度特征合成与遗传特征生成,两种自动特征生成策略的比较
  5. 延展信息按单制造ERP荣获2012中国软件优秀解决方案奖
  6. MDaemon使用技巧大全--新建账户欢迎文件的设置
  7. boost::multiprecision模块debug_adaptor相关的测试程序
  8. 看到碟摊上有D版的《阿猫阿狗2》
  9. 实践证明,SQL Server 2000 + 2005 + 2008,完全可以共存
  10. 数据处理-Batch Normalization
  11. c++两个文档匹配数据_《搜索和推荐中的深度匹配》——1.2 搜索和推荐中匹配统一性...
  12. Linux 101 Hacks __To be continued
  13. 群发的我不回??!!
  14. 读书笔记∣《世界是数字的》知识点整理
  15. ClassFinal 加密 Java class文件工具
  16. python模拟登录12306_python基于selenium模块实现自动登录12306网站
  17. SDLC - 螺旋模型
  18. windows下Ardupilot编译环境搭建
  19. ACM POJ 题目分类(完整整理版本)
  20. 【原理篇】qBittorrent下载+转种Transmission快校版+IYUU Plus辅种教程

热门文章

  1. 吃透 | Elasticsearch filter和query的不同
  2. raid重构原理_5个重构原理示例
  3. jdk11换jdk8版本_在JDK 9(以及8)以及更高版本中,所有内容都可以作为一个流
  4. libreoffice_利用Excel或LibreOffice的业务输入进行单元测试约束
  5. vue.jsr入门_JSR 365更新:深入CDI 2.0
  6. java实现资源监视器_实现Java监视的12个步骤程序存在缺陷
  7. javafx树视图加选框_JavaFX缺少的功能调查:表视图
  8. tomcat与tomee_Apache TomEE(和Tomcat)的自签名证书
  9. Java equals()和hashCode()
  10. maven项目 ant_将旧项目从Ant迁移到Maven的4个简单步骤