JNDI(Java Naming and Directory Interface)是Java平台上的一种命名和目录服务,可让Java开发人员在应用程序中访问命名和目录服务,例如LDAP(Lightweight Directory Access Protocol)和DNS(Domain Name System)。通过JNDI,开发人员可以从命名方案中查找对象,包括JDBC数据源和EJB(Enterprise JavaBean)组件。在Java中实现JNDI,开发人员需要深入了解initialcontext对象,下面将为您介绍。
一、initialcontext对象的概述
initialcontext对象是JNDI API中最重要的对象之一,它是JNDI的入口点。initialcontext对象是命名上下文的工厂,即开发人员可以通过initialcontext对象来获取命名上下文。以JDBC数据源为例,如果要获取可以访问该数据源的Connection对象,开发人员需要在JNDI命名空间中查找DataSource对象。获取DataSource对象实际上是通过initialcontext对象来实现的。initialcontext对象是JNDI API使用过程中最基本、最重要、最频繁调用的对象。
二、initialcontext对象的创建
initialcontext对象是用于获取命名/目录服务的JNDI接口。创建initialcontext对象的方式有两种:使用系统属性或使用一个Hashtable对象。
1.使用系统属性
使用系统属性的方式创建initialcontext对象会根据JNDI.properties文件查找属性,如果没有该文件,则使用系统默认属性创建initialcontext对象。下面是一个创建initialcontext对象的例子,使用系统属性方式:
```
initialcontext context = new InitialContext();
```
2.使用Hashtable对象
使用Hashtable对象创建initialcontext对象是指定一组属性,用于创建确定的命名上下文。这种方式通常使用于非标准化命名服务。下面是一个创建initialcontext对象的例子,使用Hashtable对象方式:
```
Hashtable
properties.put(Context.INITIAL_CONTEXT_FACTORY, "foo.bar.ContextFactory");
properties.put(Context.PROVIDER_URL, "ldap://localhost:389");
initialcontext context = new InitialContext(properties);
```
三、initialcontext对象的使用
initialcontext对象用于创建命名上下文和查找对象等操作。
1.创建命名上下文
JNDI服务中最重要的组件就是命名上下文,通过命名上下文访问和维护JNDI中的数据。通过initialcontext对象可以创建已经绑定了命名空间的命名上下文,绑定命名空间后,即可在该命名空间中查找其它对象。
```
initialcontext context=new InitialContext();
context.createSubcontext("jdbc/mydbconn");
```
2.在命名空间中查找对象
通过initialcontext对象,我们可以通过健名获取绑定在JNDI命名空间中的对象。在通过下面的例子,我们可以在JNDI中查找已经绑定的DataSource对象:
```
DataSource dataSource = (DataSource) context.lookup("jdbc/mydbconn");
```
3.使用initialcontext对象获取环境配置信息
只要应用程序使用JNDI,就必须为JNDI提供一定数量的环境变量。这些变量是连接到JNDI目录上下文的必需元素,包括JNDI目录的位置、协议和其他参数。使用initialcontext对象的getEnvironment()方法可以获取环境配置信息。
```
initialcontext context=new InitialContext();
Hashtable, ?> env= context.getEnvironment();
System.out.println(env.toString());
```
四、initialcontext对象的常用方法
1. createSubcontext方法
用于在当前上下文中创建一个新的命名上下文。方法参数为当前上下文中所创建的新上下文的名称。
```
public Context createSubcontext(String name)
```
2. bind方法
用于与给定名称绑定一个对象。如果该名称已经绑定了一个对象,那么bind方法将覆盖原先已经绑定的对象。
```
public void bind(Name name, Object obj)
throws NamingException
```
3. rebind方法
用于为给定名称重新绑定一个对象,如果已经绑定一个对象,则覆盖原先绑定的对象。
```
public void rebind(Name name, Object obj)
throws NamingException
```
4. unbind方法
用于将给定名称从命名空间中移除。
```
public void unbind(Name name)
throws NamingException
```
5. lookup方法
用于根据给定名字在命名空间中查找对象。
```
public Object lookup(Name name)
throws NamingException
```
6. list方法
用于列出命名上下文中所有绑定对象的名称。
```
public NamingEnumeration
throws NamingException
```
7. getEnvironment方法
用于获取initialcontext对象当前的环境配置信息。
```
public Hashtable, ?> getEnvironment()
```
五、总结
刚刚我们已经学习了initialcontext对象在JNDI API中的重要性,以及如何使用initialcontext对象进行创建、查找和维护命名上下文。在实践中,应用程序不仅仅是使用JDBC数据源,事实上,应用程序可能使用到了很多不同的命名方案。学习如何正确地使用initialcontext对象是开发人员掌握JNDI API的重要一步。