10.2.1 使用 JNDI 数据源

Spring 应用程序经常部署在 Java EE 应用服务器中,如 WebSphere、 JBoss 或甚至像 Tomcat 这样的 Web 容器中。这些服务器允许你配置通过 JNDI 获取数据源。这种配置的好处在于数据源完全可以在应用程序之外进行管理,这样应用程序只需在访问数据库的时候查找数据源就可以了。另外,在应用服务器中管理的数据源通常以池的方式组织,从而具备更好的性能,并且还支持系统管理员对其进行热切换。

利用 Spring,我们可以像使用 Spring bean 那样配置 JNDI 中数据源的引用并将其装配到需要的类中。位于 jee 命名空间下的 <jee:jndi-lookup> 元素可以用于检索 JNDI 中的任何对象(包括数据源)并将其作为 Spring 的 bean。例如,如果应用程序的数据源配置在 JNDI 中, 我们可以使用 <jee:jndi-lookup> 元素将其装配到 Spring 中,如下所示:

<jee:jndi-lookup id="dataSource" jndi-name="/jdbc/SpitterDS" resource-ref="true" />

其中 jndi-name 属性用于指定 JNDI 中资源的名称。如果只设置了 jndi-name 属性,那么就会根据指定的名称查找数据源。但是,如果应用程序运行在 Java 应用服务器中,你需要将 resource-ref 属性设置为 true,这样给定的 jndi-name 将会自动添加 “java:comp/env/” 前缀。

如果想使用 Java 配置的话,那我们可以借助 JndiObjectFactoryBean 从 JNDI 中查找 DataSource:

@Bean
public JndiObjectFactoryBean dataSource() {
  JndiObjectFactoryBean jndiObjectFB = new JndiObjectFactoryBean();
  jndiObjectFB.setJndiName("jdbc/SpittrDS");
  jndiObjectFB.setResourceRef(true);
  jndiObjectFB.setProxyInterface(javax.sql.DataSource.class);
  return jndiObjectFB;
}

显然,通过 Java 配置获取 JNDI bean 要更为复杂。大多数情况下,Java 配置要比 XML 配置简单,但是这一次我们需要写更多的 Java 代码。但是,很容易就能够看出 Java 代码中与 XML 相对应的配置,Java 配置的内容其实也不算多。

Last updated