Spring XML命名空间:如何找到它们背后的实现类?

时间:2012-06-24 01:10:57

标签: spring spring-mvc spring-security

在我的Spring 3.1应用程序中,我有时需要更改上下文文件中某些Spring命名空间的默认行为。为此,我创建了实现某些接口的自定义类,或者扩展了Spring使用的默认类。

但我发现很难确切知道Spring在其命名空间后面使用的是什么类!找到它们需要哪些步骤?

例如,安全命名空间:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:sec="http://www.springframework.org/schema/security"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
                           http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                           http://www.springframework.org/schema/security 
                           http://www.springframework.org/schema/security/spring-security-3.1.xsd">

等等:

<sec:http>
    ...
    <sec:logout />
</sec:http>

如何找到“&lt; sec:logout /&gt;”使用的类?命名空间?我查看http://www.springframework.org/schema/security/spring-security-3.1.xsd找不到相关信息!

我应该在哪里看?

4 个答案:

答案 0 :(得分:49)

每个Spring命名空间都有一个关联的NamespaceHandler实现。命名空间模式在各种spring.schemas文件中映射到Spring JAR内的模式文件(另请参阅Spring DI applicationContext.xml how exactly is xsi:schemaLocation used?)。

XML模式名称空间也映射到spring.handlers文件中的处理程序类(有几个,因为每个Spring JAR可能会引入不同的名称空间)。为方便起见,这里列出了最常见的命名空间:

Spring core

Spring Security

Spring集成

如果浏览到每个类的源代码,您将很快发现负责解析实际XML定义的各种BeanDefinitionParser实现。

答案 1 :(得分:2)

几乎所有人都被命名为*BeanDefinitionParser。第一步是,使用您的浏览器调出Spring JavaDocs并点击<Ctrl>-F(或<Command>-F)。搜索BeanDefinitionParser。在匹配的类中,一个或两个将按其名称看起来像处理您正在研究的命名空间元素。可能需要一些查看这些类的源代码,但你最终会找到你想要的东西。

或者,在IDE中,您可以浏览到BeanDefinitionParser.java,然后执行“查找用法”(IntelliJ)或“类型层次结构”(Eclipse)以查找该界面的所有实施者。有一些类不遵循*BeanDefinitionParser命名约定。您的IDE将为您提供全面的列表。

我认为Spring实际上应该在其参考文档的Namespace部分中记录处理每个元素的类的名称。

答案 2 :(得分:1)

每个XML命名空间都由其NamespaceHandler解析。安全命名空间的处理程序类是SecurityNamespaceHandler,它在spring-security-config-XXX.jar文件的META-INF内的spring.handlers文件中指定。

http元素由HttpSecurityBeanDefinitionParser解析,其子元素注销由org.springframework.security.config.http.LogoutBeanDefinitionParser解析(受包保护)。

如果您打算自定义,请参阅Coding a NamespaceHandler中的说明和What beans are registered by the spring security namespace?中的建议。

答案 3 :(得分:0)

对于Spring Security,它有详细记录:请参阅Appendix B. The Security Namespace

另请参阅此博文:BEHIND THE SPRING SECURITY NAMESPACE