JNDI的目的是什么?
如果可能的话,你怎样才能实现JNDI的使用?
JNDI是Java命名和目录接口。 它被用来区分应用程序开发者和应用程序部署者的关注点。 在编写依赖于数据库的应用程序时,您不必担心连接到该数据库的用户名或密码。 JNDI允许开发人员给数据库命名,并依靠部署人员将该名称映射到数据库的实际实例。
例如,如果您正在编写在Java EE容器中运行的代码,则可以使用JNDI名称“Database”来编写该代码以获取数据源:
DataSource dataSource = null; try { Context context = new InitialContext(); dataSource = (DataSource) context.lookup("Database"); } catch (NamingException e) { // Couldn't find the data source: give up }
请注意,这里没有关于数据库驱动程序,用户名或密码的信息。 这是在容器内部configuration的。
JNDI不限于数据库(JDBC); 各种服务都可以得名。 有关更多详细信息,您应该查看有关该主题的Sun教程 。
JNDI是一个非常强大的机制,通过使用EventContext
来组织configuration信息和发现和监听服务 。 在JNDI中,您可以查找并侦听任何对象(不只是DataSource
),假设您的JNDI服务提供者支持它。
当然,唯一的问题实际上是有一个JNDI服务提供者; 这个伟大的事情是,它是惊人的容易推出自己的。 毕竟,您可以使用JavaBeans XMLEncoder
和XMLDecoder
将任何Java实例编码为XML
:您不需要依赖在应用程序服务器中运行!
那么这个configuration文件有什么区别呢? 那么,它可以更清洁,因为所有的应用程序可以从同一个地方得到他们的configuration。 如果他们需要共享configuration信息(例如数据库位置),那么可以在JNDI中定义一次 。 假设你移动了数据库服务器:你不需要记住gazillionconfiguration文件中的位置。 你只要去一个地方:JNDI。
JNDI是一个用于访问目录和命名服务的API(即名称与对象关联的方式)。 名称与对象的关联称为绑定。
命名服务的基本示例是将机器名称映射到IP地址的DNS。
使用JNDI,应用程序可以存储和检索任何types的已命名的Java对象。
在java的上下文中,这可以用在你不想硬编码环境特定variables的configuration文件中。
Spring例子:
Spring上下文文件
<bean id="WSClientConfig" class="com.example.BaseClientConfigImpl"> <property name="protocol"> <jee:jndi-lookup jndi-name="java:comp/env/protocol" /> </property> <property name="endpoint"> <jee:jndi-lookup jndi-name="java:comp/env/endpoint" /> </property> <property name="requestPath"> <jee:jndi-lookup jndi-name="java:comp/env/requestPath" /> </property>
Tomcat上下文文件
<Environment name="protocol" type="java.lang.String" value="https://"/> <Environment name="endpoint" type="java.lang.String" value="172.0.0.1"/> <Environment name="requestPath" type="java.lang.String" value="/path/to/service"/>
JNDI允许将资源构造简化为一个名称 。 所以,为了方便/安全等等,把许多细节分成了一组 。 (又名抽象层)
要实现:设置与Jndi上下文界面中预定义字段对应的属性列表。 (这些属性指定jndi执行的设置;但不*search名称)
Properties props = new Properties(); //field Context.INITIAL_CONTEXT_FACTORY => property name java.naming.factory.initial //field Context.PROVIDER_URL => property name java.naming.provider.url props.load(new FileInputStream("*properties file*")); //prop file in this case Context ctx = new InitialContext(props); Object o = ctx.lookup("*name of resource*");
理想情况下,将存在一个专门的function来维护您的组织中的LDAP目录,DNS等(因此统一的单个映射集可以提供所有服务,从而减less差异)
JNDI服务提供商列表: https : //www.ibm.com/support/knowledgecenter/en/SSVSD8_8.4.1/com.ibm.websphere.dtx.adapjndi.doc/concepts/c_jndi_JNDI_Service_Providers_.htm