考虑一种情况,必须为没有自定义名称空间的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
<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