2012-09-03 71 views
2

我有時使用Spring的自定義命名空間。像CXF one或ActiveMQ一樣。如何解碼Spring中的自定義名稱空間?

這裏是我如何申報我的嵌入式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: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


但有時候自定義命名空間文件entation是不夠精確,我想了解什麼是根據Java類的引擎蓋下...

所以我想知道的是如何獲得原始Spring bean聲明等價的一個自定義命名空間的用法

是否有任何IDE中包含「自動翻譯工具」?

據我所知,似乎有不同的工具來創建自定義Spring命名空間,如XBean ...有沒有一種自動或手動的方式來了解如何在不知道所有這些工具的情況下在引擎蓋下工作命名空間?

感謝

回答

3

這是一個很好的參考Spring是如何處理自定義命名空間 - http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/extensible-xml.html#extensible-xml-schema

每一個自定義命名空間具有在不同的jar文件使用spring.handler文件META-INF/spring.handlers註冊的相關NamespaceHandler

例如,上下文的命名空間,如果你考慮在彈簧context*.jar fileMETA-INF/spring.handlers,你會看到上下文命名空間namespacehandler:

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

其內部寄存器的背景下命名空間中的標籤不同的解析器。

registerBeanDefinitionParser("property-placeholder", new PropertyPlaceholderBeanDefinitionParser()); 
    registerBeanDefinitionParser("property-override", new PropertyOverrideBeanDefinitionParser()); 
這些解析器

註冊你所提到的不同bean定義 -

所以,遺憾的是沒有簡單的工具來找出哪些bean定義註冊了一個特定的自定義命名空間,你將不得不通過特定BeanDefinition解析器的代碼。

XBean它使用ActiveMQ的簡化註冊自定義Namespacehandler一點,通過處理一些鍋爐板

+0

感謝漂亮的答案的過程。所以最後,如果庫本身提供了「原始Spring等價」,那麼我們就不必檢查名稱空間是如何工作的。 –

+1

是的,本質上。我有時候會把它看作是允許底層實現發生變化的抽象,例如,在Spring 3.1.0之前,用於註冊AnnotationDrivenHandlerAdapter的'mvc:annotation-driven'名稱空間現在在Spring 3.1.x中是RequestMappingHandlerAdapter,它行爲非常不同,但從用戶的角度看,沒有任何改變,'mvc:annotation-driven'已經阻止了用戶的這種改變 –

相關問題