从 Spring applicationContext xml / Junit 测试用例访问 Web/App Server 中定义的 JNDI 数据源

Posted

技术标签:

【中文标题】从 Spring applicationContext xml / Junit 测试用例访问 Web/App Server 中定义的 JNDI 数据源【英文标题】:Accessing JNDI datasource defined in Web/App Server from Spring applicationContext xml / Junit Test cases 【发布时间】:2014-06-05 21:32:06 【问题描述】:

发现几个博客提供了定义 jndi 数据源然后从 Spring Container 访问的步骤。

方法一:

1. Creating a file context.xml in src\main\webapp\META-INF folder and defining all 
   relevant jndi datasources.
2. Accessing jndi datasource from spring application context.xml file by using
   <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">        
    <property name="jndiName" value="java:comp/env/jdbc/MyDB"/>
   </bean>

我尝试了上面的配置,这很有效。

我也找到了一些其他方法。

方法2:http://makecodeeasy.blogspot.in/2013/05/jndi-datasource-in-spring.html和Tomcat 6/7 JNDI with multiple datasources在哪里

1. Datasources are defined in server.xml file (tomcat) and refered in web.xml file.
2. Accessing jndi datasources from spring application context.xml file 
   using JndiObjectFactoryBean with an additional resource ref attribute.

再次。如何使用下面的行来实现上述两种方法中的第 2 步。

<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/MyDB" />

基本上我想知道哪个是更好的服务器连接池机制。一种方法比其他方法有什么优势。哪个是先进的,为什么?

==已编辑==

一旦 spring 应用上下文通过 context.xml 中定义的 jndi 获取数据源相关信息,运行 Standalone 而非 Web Container 的 Junit 测试用例如何访问 JNDI 资源?

谁能帮我弄清楚这些。

【问题讨论】:

【参考方案1】:

查看this 文档,似乎这两种方法的作用完全相同。

就连接池而言,JNDI 查找与此无关。无论您在context.xml(或您使用的任何等价物)中声明的任何连接池都将被 Spring 查找和使用。如果您将BoneCP 声明为您的连接池,那么它将被使用,同样如果您使用Tomcat Connection pool 或其他任何内容。

【讨论】:

JNDI在spring context xml中的使用方式呢?使用 JndiObjectFactoryBean 或 两者意义相同? 好像意思一模一样 测试用例如何在 META-INF 文件夹中作为 context.xml 运行,测试类将无法使用。 在测试中做类似@ContextConfiguration(locations = "classpath:/META-INF/spring/context.xml") 的事情确实有效

以上是关于从 Spring applicationContext xml / Junit 测试用例访问 Web/App Server 中定义的 JNDI 数据源的主要内容,如果未能解决你的问题,请参考以下文章

面试阿里,字节,美团必看的Spring的Bean管理详解

Spring 的历史

jap_spring

ssm applicationContent.xml

Spring - ApplicationContextInitializer 扩展接口

Spring - ApplicationContextInitializer 扩展接口