在我的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找不到相关信息!
我应该在哪里看?
答案 0 :(得分:49)
每个Spring命名空间都有一个关联的NamespaceHandler
实现。命名空间模式在各种spring.schemas
文件中映射到Spring JAR内的模式文件(另请参阅Spring DI applicationContext.xml how exactly is xsi:schemaLocation used?)。
XML模式名称空间也映射到spring.handlers
文件中的处理程序类(有几个,因为每个Spring JAR可能会引入不同的名称空间)。为方便起见,这里列出了最常见的命名空间:
aop
- AopNamespaceHandler
c
- SimpleConstructorNamespaceHandler
cache
- CacheNamespaceHandler
context
- ContextNamespaceHandler
jdbc
- JdbcNamespaceHandler
jee
- JeeNamespaceHandler
jms
- JmsNamespaceHandler
lang
- LangNamespaceHandler
mvc
- MvcNamespaceHandler
oxm
- OxmNamespaceHandler
p
- SimplePropertyNamespaceHandler
task
- TaskNamespaceHandler
tx
- TxNamespaceHandler
util
- UtilNamespaceHandler
security
- SecurityNamespaceHandler
oauth
- OAuthSecurityNamespaceHandler
int
- IntegrationNamespaceHandler
amqp
- AmqpNamespaceHandler
event
- EventNamespaceHandler
feed
- FeedNamespaceHandler
file
- FileNamespaceHandler
ftp
- FtpNamespaceHandler
gemfire
- GemfireIntegrationNamespaceHandler
groovy
- GroovyNamespaceHandler
http
- HttpNamespaceHandler
ip
- IpNamespaceHandler
jdbc
- JdbcNamespaceHandler
jms
- JmsNamespaceHandler
jmx
- JmxNamespaceHandler
mail
- MailNamespaceHandler
redis
- RedisNamespaceHandler
rmi
- RmiNamespaceHandler
script
- ScriptNamespaceHandler
security
- IntegrationSecurityNamespaceHandler
sftp
- SftpNamespaceHandler
stream
- StreamNamespaceHandler
twitter
- TwitterNamespaceHandler
ws
- WsNamespaceHandler
xml
- IntegrationXmlNamespaceHandler
xmpp
- XmppNamespaceHandler
如果浏览到每个类的源代码,您将很快发现负责解析实际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