29

在我的 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>

如何找到“<sec:logout />”命名空间使用了哪些类?我没有通过查看http://www.springframework.org/schema/security/spring-security-3.1.xsd找到信息!

我应该去哪里看?

4

4 回答 4

49

每个 Spring 命名空间都有一个关联的NamespaceHandler实现。命名空间模式映射到 Spring JAR 中各种spring.schemas文件中的模式文件(另请参阅Spring DI applicationContext.xml xsi:schemaLocation 究竟是如何使用的?)。

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

弹簧芯

春季安全

弹簧集成

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

于 2012-06-24T09:05:26.737 回答
2

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

或者,在您的 IDE 中,您可以浏览BeanDefinitionParser.java并执行“Find Usages”(IntelliJ)或“Type Hierarchy”(Eclipse)来查找该接口的所有实现者。有少数类不遵循*BeanDefinitionParser命名约定。您的 IDE 将为您提供一个完整的列表。

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

于 2012-06-24T02:39:46.560 回答
1

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

http 元素由HttpSecurityBeanDefinitionParser解析,其子元素 logout 由org.springframework.security.config.http.LogoutBeanDefinitionParser(package-protected) 解析。

另请参阅编码 NamespaceHandler中的注释和Spring Security 命名空间注册了哪些 bean?如果您打算自定义它。

于 2012-06-24T02:28:37.047 回答
0

对于 Spring Security,它有很好的文档记录:参见附录 B。安全命名空间

另请参阅此博客文章:在 SPRING SECURITY NAMESPACE 背后

于 2012-06-25T03:58:43.617 回答