InitialContext是Java JNDI API中的一个核心类,它提供了一种在企业级Java应用中访问命名和目录服务的方式。 在大型企业应用系统中,经常需要使用许多不同的资源,比如数据库连接池、电子邮件服务器、Web服务等等。访问这些资源的正确方式,就是借助InitialContext对象。 本文将深入探讨Java中的InitialContext的概念,帮助读者更好的理解并实现InitialContext。
一、InitialContext是什么?
InitialContext是Java JNDI API中的一个类,用于连接到命名服务和目录服务,它是从javax.naming.Context继承而来。在使用InitialContext之前,您需要了解两个概念-命名和目录服务。
命名服务用于将名称和对象关联起来,并将名称公开给客户端,以便客户端可以查找和访问对象。JNDI的一个主要用途就是将名称与Java对象相互关联。JNDI解决的主要问题是为对象提供唯一标识符,以便跨JVM、网络或进程之间定位对象。
目录服务是一个结构化命名空间,用于存储信息,这些信息可以用于进行查询和查找。JNDI提供了一种标准方法,使得用户可以使用Java类来管理目录与服务之间的交互。
InitialContext充当了客户端和命名服务或目录服务之间的中间层。客户端使用JNDI的API访问InitialContext,而InitialContext利用具体实现将API调用转换为对命名服务或目录服务的请求。这样,客户端可以充分利用命名服务或目录服务的功能,而无需直接调用底层服务。
二、InitialContext如何使用?
要使用InitialContext,您需要知道以下三个参数:
```
Hashtable
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");
env.put(Context.PROVIDER_URL, "file:/");
InitialContext ctx = new InitialContext(env);
```
1、Context.INITIAL_CONTEXT_FACTORY
INITIAL_CONTEXT_FACTORY是一个字符串常量,它指定要使用的InitialContext工厂的类名称。InitialContext工厂是JNDI的一部分,它充当了创建和配置InitialContext实例的工具。在使用InitialContext之前,必须指定INITIAL_CONTEXT_FACTORY。如果未指定此属性,则使用默认的InitialContext实现。
默认情况下,INITIAL_CONTEXT_FACTORY属性指定了com.mycompany.myproduct.util.MyInitialContextFactory。该实现包含在JNDI API中。
2、Context.PROVIDER_URL
PROVIDER_URL是一个字符串常量,它指定要访问的命名服务或目录服务的URL。该URL应该包含必要的信息,如服务器名称、协议和端口号等。当INITIAL_CONTEXT_FACTORY被指定时,必须指定PROVIDER_URL。
3、InitialContext
InitialContext是一种标准的Java类,其构造函数需要一个Hashtable类型的参数,该参数指定JNDI的参数。在第一个参数Hashtable中存储了INITIAL_CONTEXT_FACTORY和PROVIDER_URL属性,刚刚也已经讲到。
现在,我们已经知道了使用InitialContext所需的三个必要参数,让我们来看一个使用示例,以便更好地理解InitialContext的工作原理。
```
public static Connection getConnection() throws NamingException, SQLException {
Connection conn = null;
Hashtable
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");
env.put(Context.PROVIDER_URL, "file:/");
InitialContext ctx = new InitialContext(env);
DataSource ds = (DataSource) ctx.lookup("jdbc/mydb");
if (ds != null) {
conn = ds.getConnection();
}
return conn;
}
```
在上面的示例中,我们使用InitialContext获取mysql数据库连接。根据以上步骤,我们首先创建一个Hashtable并向其添加两个必要的参数 - INITIAL_CONTEXT_FACTORY和PROVIDER_URL。接下来,我们创建InitialContext实例,并使用lookup方法查找名为“jdbc/mydb”的DataSource。如果成功找到,则返回连接对象。
三、InitialContext的实现
Java中有各种类型的InitialContext实现,以下是一些常见实现介绍:
1、LDAPInitialContextFactory
LDAPInitialContextFactory用于通过LDAP协议访问目录服务。JNDI使用此协议访问常见的目录服务,如Netscape或Microsoft Active Directory。
2、RMIInitialContextFactory
使用RMIInitialContextFactory可以通过RMI协议访问对象。该实现通常用于客户端应用程序和J2EE服务器之间的通信。
3、FileSystemInitialContextFactory
FileSystemInitialContextFactory用于在文件系统中存储和访问Java对象。可以使用此实现在本地文件系统上创建和存储对象。
4、URLInitialContextFactory
URLInitialContextFactory用于通过URL访问命名服务。可以使用此实现访问标准的Web Services名字空间(例如SOAP)。
5、JnpProvider
JnpProvider是Red Hat JBoss服务器的InitialContext实现。该实现是一个纯Java实现,可用于访问Red Hat JBoss服务器上的对象。
四、InitialContext的不同用途
下面,我们将涵盖InitialContext在不同用途中的使用。
1、连接池
连接池是常见的企业级应用程序组件,它可以有效地管理数据库连接。使用池连接,可以优化数据库性能,并大大降低数据库连接开销。连接池让应用程序访问可重用的连接,避免了在每次请求时建立新连接的开销。
数据库连接池可以使用Connection Pooling API(JDBC4.0)。这就是“JDBC Connection Pooling”的实现方法。应用程序使用JNDI API访问Connection Pooling实现中的数据源,然后使用该数据源获取数据库连接。
2、EJB
EJB(Enterprise Java Beans)是用于构建企业级应用程序的一个规范。在EJB中,开发人员只需实现业务逻辑,而无需关注底层系统的复杂性。 可以通过JNDI API使用InitialContext查找EJB对象,并将其注入到应用程序中。
3、Web Services
Web服务是企业级应用程序的关键部分。Web服务通过SOAP协议公开企业资源和应用程序功能。 可以使用JNDI API访问Web服务,以更好地管理应用程序中使用的Web服务。
五、总结
InitialContext是Java JNDI API的一个核心类,用于在企业级Java应用中访问命名和目录服务。了解InitialContext的概念和工作原理,可以帮助开发人员更好地理解和实现InitialContext。在使用InitialContext时,需要知道必要的参数INITIAL_CONTEXT_FACTORY和PROVIDER_URL,并准确地指定InitialContext实现。值得一提的是InitialContext可以采用连接池、EJB和Web Services等不同用途。掌握InitialContext的基础知识,对于企业应用程序开发至关重要。