使用Spring的SimpleNamingContextBuilder的应用程序如何知道在其目录中搜索资源?

使用Spring的SimpleNamingContextBuilder作为其JNDI提供程序的应用程序如何知道在其目录中搜索资源? 什么将应用程序链接到Spring命名目录? 例如,这个早期答案中的JndiObjectFactoryBean bean如何知道在Spring目录中找到资源my-dbJndiObjectFactoryBean是否需要将属性java.naming.factory.initial设置为接口InitialContextFactory某些实现的上下文环境? 使用SimpleNamingContextBuilder作为JNDI提供程序时, java.naming.factory.initial的值应该是多少?

简而言之,如果想在unit testing中使用模拟InitialContext来模拟JNDI树,可以使用SimpleNamingContextBuilder。 我在一个启动测试方法中实例化了SimpleNamingContextBuildeit,并成功创建了一个内存中的InitialContext。 例如在春季测试class..

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

Java运行时类NamingManager充当Java应用程序及其命名目录之间的链接。 当SimpleNamingContextBuilder 激活时 ,它会将自身安装到NamingManager静态成员InitialContextFactoryBuilder 。 当应用程序创建一个InitialContext来检索JNDI上下文时,类InitialContext委托给NamingManager,而NamingManager又要求IntialContextFactoryBuilder (在本例中为SimpleNamingContextBuilder )创建一个IntialContextFactory ,它最终会创建InitialContext

JndiObjectFactoryBean不需要显式的上下文环境,因为SimpleNamingContextBuilderSimpleNamingContextBuilder提供了InitialContextFactory ,而JndiObjectFactoryBean使用NamingManager来检索其资源。 因此,在前面的答案中, JndiObjectFactoryBean “知道”在Spring命名目录中搜索资源my-db因为SimpleNamingContextBuilder已将自己建立为SimpleNamingContextBuilder中的JNDI提供程序。