一、InitialContext是什么?
在JNDI(Java Naming and Directory Interface)中,InitialContext是一个接口,用于访问命名和目录服务,它是JNDI的入口,首先与底层命名服务建立连接。
InitialContext持有一个环境属性的Hashtable,这个环境属性用于设置与底层命名服务的连接。通过设置不同的环境属性,可以连接到不同的命名服务,例如JNDI服务提供者,LDAP(轻量级目录访问协议)服务等。
二、InitialContext的使用
1、创建InitialContext对象
可以通过两种方式来创建InitialContext对象:
Hashtable env = new Hashtable(); env.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory"); env.put(javax.naming.Context.PROVIDER_URL, "file:/home/user/"); //方式1 InitialContext ctx = new InitialContext(env); //方式2 InitialContext ctx = new InitialContext();
方式1:通过设置Hashtable的环境属性,显式指定与底层命名服务的连接方式。
方式2:使用默认的环境属性,连接默认的命名服务。在应用程序中,一般采用第二种方式。
2、在InitialContext中查找对象
InitialContext提供了lookup方法,用于在命名服务中查找对象。
//查找名称为"jdbc/myDatasource"的数据源 DataSource myDatasource = (DataSource) ctx.lookup("jdbc/myDatasource");
上面的代码将在名为"jdbc/myDatasource"的上下文中查找数据源,并将它强制转换为DataSource对象。
3、绑定对象到InitialContext
与查找对象相对应的是将对象绑定到命名空间中,这可以用bind方法实现。
//绑定名为"myObject"的对象到InitialContext MyObject obj = new MyObject(); ctx.bind("myObject", obj);
上面的代码将一个名为"myObject"的对象绑定到InitialContext中。
4、InitialContext的关闭
当InitialContext不再需要时,应该将其关闭。关闭InitialContext将释放与底层命名服务的连接。
//关闭InitialContext ctx.close();
三、InitialContext的异常处理
在使用InitialContext从命名服务中查找对象时,可能会出现NameNotFoundException异常。这通常表示查找的对象不存在。
try { MyObject obj = (MyObject) ctx.lookup("myObject"); } catch (NameNotFoundException e) { System.out.println("Object not found!"); }
除了NameNotFoundException,InitialContext还会抛出许多其他异常。例如:NamingException,CommunicationException等。这些异常可用于调试和恢复连接错误。
四、总结
InitialContext是JNDI的入口,用于访问命名和目录服务,它提供了查找和绑定对象的方法。
通过设置InitialContext的环境属性,可以连接到不同的命名服务。在应用程序中,一般采用默认的环境属性。
在使用InitialContext时,需要注意异常处理,以便调试和恢复连接错误。