2

我有时会在 Spring 中使用自定义命名空间。就像 CXF 或 ActiveMQ 一样。

这是我如何声明我的嵌入式 ActiveMQ 代理服务器的示例:

<amq:broker useJmx="false" persistent="true">
    <amq:transportConnectors>
        <amq:transportConnector uri="${mobilepush.activemq.broker.transport.connector.uri}" />
    </amq:transportConnectors>
    <amq:persistenceAdapter>
        <amq:kahaPersistenceAdapter directory="${mobilepush.activemq.broker.queue.persistence.directory}" maxDataFileLength="33554432"/>
    </amq:persistenceAdapter>
</amq:broker>

我对 Spring 的自定义命名空间了解不多,但在我看来,这些命名空间只是为更详细的 Spring bean 声明提供了一个“快捷方式”。

一些像 Xebia Management Extras 这样的库在他们的文档中提供了自定义命名空间和原始 spring 实现之间的等价性:

<management:jms-connection-factory-wrapper 
             id="connectionFactory" 
             connection-factory="rawConnectionFactory" />

等于:

   <bean id="connectionFactory" class="fr.xebia.management.jms.SpringManagedConnectionFactory">
      <property name="connectionFactory" ref="rawConnectionFactory" />
   </bean>

http://code.google.com/p/xebia-france/wiki/ManagedJmsConnectionFactory


但有时自定义命名空间文档不够精确,我想了解 Java 类的幕后情况......

所以我想知道的是如何获得自定义命名空间使用的原始 Spring bean 声明等效性?

任何 IDE 中是否包含任何“自动翻译工具”?

据我所知,似乎有不同的工具可以创建自定义的 Spring 命名空间,比如 XBean... 是否有一种自动或手动的方式来了解命名空间是如何在不了解所有这些工具的情况下工作的?

谢谢

4

1 回答 1

3

这是对 Spring 如何处理自定义命名空间的一个很好的参考 - http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/extensible-xml.html#extensible-xml-schema

每个自定义命名空间都有一个关联的NamespaceHandler,它使用 spring.handler 文件META-INF/spring.handlers在不同的 jar 文件中注册。

例如。上下文命名空间,如果你查看META-INF/spring.handlersin spring-context*.jar file你会看到上下文命名空间的命名空间处理程序:

http\://www.springframework.org/schema/context=org.springframework.context.config.ContextNamespaceHandler

它在内部为上下文命名空间下的标签注册不同的解析器。

    registerBeanDefinitionParser("property-placeholder", new PropertyPlaceholderBeanDefinitionParser());
    registerBeanDefinitionParser("property-override", new PropertyOverrideBeanDefinitionParser());

这些解析器中的每一个都注册您提到的不同 bean 定义 -

所以不幸的是,没有简单的工具可以找出为特定自定义命名空间注册了哪些 bean 定义,您将不得不查看特定 BeanDefinition 解析器的代码。

ActiveMQ 使用的 XBean 通过处理一些样板文件,稍微简化了注册自定义命名空间处理程序的过程

于 2012-09-03T16:20:19.940 回答