动态传递 JNDI 名称

Passing the JNDI name dynamically

我有很多具有不同 JNDI 名称的数据库连接的 Websphere 服务器,因此我必须为每个服务器构建许多 ears 文件。我想做这样的事情:

<bean id="dbDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="${SPECIFIC_JNDI_NAME}"/>
</bean>

如何创建这个 SPECIFIC_JNDI_NAME 变量?

这是错误的做法。 JNDI 的一个优点是您可以在一个 JNDI 名称下绑定对象(在本例中为数据源),而无需关心它来自何处、如何实例化等,只要它在第一次访问时就在那里.

您(或配置 JNDI 名称的任何人)基本上是在尝试通过将不同的数据源绑定到不同的 JNDI 名称来剥夺这种优势。

一种解决方法是将 'custom' 名称绑定到 'standard' JNDI 名称,这样您的应用程序仍然可以引用 'standard' 名称和提供正确 bean 的责任是在那些配置 JNDI 的人身上,但实际上,如果你走那么远,你也可以只给数据源一个标准名称。另外,我不确定这在 JNDI 中是否可行,我只知道它曾经在 Spring 自己的配置中是可能的。

正确的 Java EE 方法是在代码中使用资源引用,例如:java:comp/env/jdbc/myDSRef,然后在安装过程中将此资源引用绑定到实际的 JNDI 名称。

您可以通过 @Resource 标记定义引用,或者在部署描述符中输入(web.xmlejb-jar.xml)。

您可以通过管理控制台、wsadmin 安装脚本或放置在 WEB-INF 文件夹中的 ibm-web-bnd.xml 文件将其映射到 JNDI 名称。

可以使用 Spring 的引用。