Spring自定义命名空间

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值