01_Java通信_JNDI_概念

在S2SH開發中會使用的Spring來注入數據源,在本地開發時我們使用<bean>注入數據源

	<bean id="dataSourceSpied" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="${jdbc.driverClassName}" />
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
		<property name="maxActive" value="${jdbc.maxActive}" />
	</bean>

 

上面的配置文件取自Spring中,有了dataSourceSpied就可以將這個數據源引入到hibernate的sessionFactory

	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
		<!-- 配置sessionFactory中要用的數據源 -->
		<property name="dataSource" ref="dataSourceSpied" />
		...
	</bean>

 

但是在生產上,或者測試環境數據庫的鏈接、用戶名、密碼都是很重要的信息,不能直接暴露在外面。所以在生成、測試環境我們會使用JNDI這種服務來得到數據庫鏈接

<jee:jndi-lookup id="dataSourceSpied" jndi-name="dataSourceDBaihis" />

然後再web服務器上創建數據源。我們使用weblogic11這種web服務器,在上面創建數據源,數據源的名字叫做“dataSourceDBaihis”這樣在Spring配置文件中使用:

<jee:jndi-lookup id="dataSourceSpied" jndi-name="dataSourceDBaihis" />

就能得到數據源。

那麼什麼叫做JNDI呢?

JNDI:Java Naming and Directory Interface,Java命名和目錄接口

是一種命名服務的抽象機制,用通俗的話講就是:我知道在網絡上有一個對象,並且知道這個對象的名字和網絡地址,那麼我可以通過JNDI來獲得這個網絡上的對象

非通俗解釋:

JNDI的目的是用來查找J2EE服務器的註冊資源。只要該對象在命名服務器上註冊過,且你知道命名服務器的地址和該對象在命名服務器上註冊的JNDI名。這樣你就可以在無需知道對象位置的情況下獲取和使用對象。

拿上面介紹的數據源來說明:

項目中沒有正在實例化數據源,只是通過jndi-lookup呼叫了一個數據。我知道數據源的名字,因爲項目部署在weblogic上,所以項目自然知道這個數據源的地址。所以項目知道了數據源對象的地址和數據源的名稱,這樣就可以通過JNDI獲得這個數據,並注入到hibernate中。

 

Java對JNDI只提供接口,使用JNDI只需要用到JNDI接口而不必關心具體實現。這就類似與Java的JDBC,Java也只是提供了JDBC的接口,各個數據庫廠家提供接口的實現。開發過程中程序員不用關心廠家是如何實現的,只需要面向接口編程即可。

以上完全是停留在概念上理解什麼是JNDI,下節將要介紹兩個簡單的例子,這樣我們可以更加清晰的認識到JNDI是如何獲得遠程對象的。先在這裏做個小鋪墊,因爲Java只提供了JNDI的接口,所以在寫demo過程中要用到廠家提供的實現。我在這裏列舉了各個廠家提供的鏈接和工廠類:

//jboss:
Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"
Context.URL_PKG_PREFIXES, "org.jboss.naming"
Context.PROVIDER_URL, "localhost:1099"

//weblogic:
Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory"
Context.PROVIDER_URL, "t3://localhost:7001"

//apusic(金蝶):
Context.INITIAL_CONTEXT_FACTORY, "com.apusic.jndi.InitialContextFactory"
Context.PROVIDER_URL, "rmi://localhost:6888"

//WebSphere:
Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory"
Context.PROVIDER_URL, "iiop://localhost:900"


//J2EE  SDK(J2EE  RI):
Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.cosnaming.CNCtxFactory"
Context.PROVIDER_URL, "iiop://127.0.0.1:1050"

//SilverStream:
Context.INITIAL_CONTEXT_FACTORY, "com.sssw.rt.jndi.AgInitCtxFactory"
Context.PROVIDER_URL, "sssw://localhost:80"

//OC4J:
Context.INITIAL_CONTEXT_FACTORY, "com.evermind.server.rmi.RMIInitialContextFactory"
Context.PROVIDER_URL, "ormi://127.0.0.1/"

//WAS5:
Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory"
Context.PROVIDER_URL, "iiop://localhost:2809"

 解釋一下上述代碼:

Context.INITIAL_CONTEXT_FACTORY:指定到目錄服務的連接工廠
Context.PROVIDER_URL:目錄服務提供者URL

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章