2011-04-15 36 views
6

如何使用Spring的SimpleNamingContextBuilder作爲JNDI提供程序知道要在其目錄中搜索資源的應用程序?什麼將應用程序鏈接到Spring命名目錄?例如,在早期的answer中的JndiObjectFactoryBean bean如何知道在Spring目錄中找到資源my-dbJndiObjectFactoryBean是否需要一個上下文環境,並將屬性java.naming.factory.initial設置爲接口InitialContextFactory的某些實現?當使用SimpleNamingContextBuilder作爲JNDI提供者時,java.naming.factory.initial的值應該是多少?如何知道使用Spring的SimpleNamingContextBuilder來搜索其目錄中的資源?

回答

8

Java運行時類NamingManager充當Java應用程序與其命名目錄之間的鏈接。當一個SimpleNamingContextBuilderactivates,它將自己安裝到NamingManager的靜態成員InitialContextFactoryBuilder。當應用程序創建InitialContext以檢索JNDI上下文時,類InitialContext將代表指定給NamingManager,然後請求IntialContextFactoryBuilder(在此例中爲SimpleNamingContextBuilder)創建IntialContextFactory,最終創建InitialContext

JndiObjectFactoryBean因爲SimpleNamingContextBuilder提供InitialContextFactoryNamingManagerJndiObjectFactoryBean使用NamingManager檢索其資源並不需要一個明確的上下文環境。因此,在之前的回答中,JndiObjectFactoryBean「知道」要在Spring命名目錄中搜索資源my-db,因爲SimpleNamingContextBuilder已將自己建立爲NamingManager中的JNDI提供程序。

13

簡而言之,如果想在單元測試中用模擬InitialContext模擬JNDI樹,可以使用SimpleNamingContextBuilder。我在測試的啓動方法中實例化了SimpleNamingContextBuildeit,併成功創建了一個內存中的InitialContext。 例如在彈簧測試類..

@BeforeClass 
    public static void setupJndi() throws Exception { 
    SimpleNamingContextBuilder.emptyActivatedContextBuilder(); 
    Context context = new InitialContext(); 
    context.bind("java:comp/env/jms/ConnectionFactory",myJmsConnectionFactory); 
    } 
+1

很好的例子!這說明了我的觀點,即當你激活一個'SimpleNamingContextBuilder'時,它將自己安裝爲默認的JNDI上下文。 – 2011-04-19 18:02:12

相關問題