2009-08-29 10 views
70

Wie können Sie die Verwendung von JNDI, mit einem Beispiel wenn möglich, realisieren?Was ist der Zweck von JNDI

+3

Sie können für Anwendungsfälle einen persönlichen Blog-Post überprüfen: http : // tshikatshikaaa.blogspot.com/2013/01/what-is-jndi-spi-cci-ldap-and-jca.html – JVerstry

+0

@JVerstry +1 für den Hinweis auf einen Artikel, der über verwandte LDAP, JCA und CCI spricht. – Ajay

+0

Auschecken [dieser SO-Thread] (http://StackOverflow.com/A/21227726/2396539) –

Antwort

90

JNDI ist die Java Naming und Directory Interface. Es wird verwendet, um die Bedenken der Anwendung Entwickler und die Anwendung Deployer zu trennen. Wenn Sie eine Anwendung schreiben, die auf einer Datenbank basiert, sollten Sie sich nicht um den Benutzernamen oder das Kennwort für die Verbindung zu dieser Datenbank kümmern müssen. JNDI ermöglicht es dem Entwickler, einer Datenbank einen Namen zu geben und sich auf den Deployer zu verlassen, um diesen Namen einer tatsächlichen Instanz der Datenbank zuzuordnen.

Zum Beispiel, wenn Sie Code schreiben, die in einem Java EE Container ausgeführt wird, können Sie dies schreibe halten, die Datenquelle erhalten mit JNDI-Namen „Datenbank“:


DataSource dataSource = null; 
try 
{ 
    Context context = new InitialContext(); 
    dataSource = (DataSource) context.lookup("Database"); 
} 
catch (NamingException e) 
{ 
    // Couldn't find the data source: give up 
} 

Hinweis gibt es nichts hier über den Datenbanktreiber oder den Benutzernamen oder das Passwort. Das ist im Container konfiguriert.

JNDI ist nicht auf Datenbanken beschränkt (JDBC); Alle Arten von Dienstleistungen können mit Namen versehen werden. Für weitere Details sollten Sie sich die Sun tutorial zum Thema ansehen.

+9

Also wie unterscheidet sich JNDI von diesem Beispiel in Bild von dem Einfügen von Datenbanknamen in eine XML-Konfigurationsdatei oder eine Eigenschaftendatei und dann Lesen Sie es von dort? – Ajay

+9

Zuerst müssen Sie das Passwort in Klartext in Ihrer Konfigurationsdatei speichern. Zweitens, wenn mehrere Apps auf dieselbe Datenbank verweisen und sich etwas an der Datenbankkonfiguration ändert, müssen Sie die Konfiguration an mehreren Stellen aktualisieren. –

+0

nun, wie hilft JNDI hier? – Ajay

26

JNDI ist ein sehr leistungsfähiger Mechanismus zum Organisieren von Konfigurationsinformationen und Entdecken und Abhören von Diensten über die EventContext. In JNDI können Sie irgendein Objekt suchen und hören (nicht nur DataSource s), vorausgesetzt Ihr JNDI-Dienstanbieter unterstützt es.

Natürlich ist das einzige Problem, einen JNDI-Dienstanbieter tatsächlich zu haben; Das Tolle daran ist, dass es überraschend einfach ist, selbst zu rollen. Schließlich können Sie jede Java-Instanz in XML mit den JavaBeans XMLEncoder und XMLDecoder codieren: Sie müssen nicht darauf angewiesen sein, innerhalb eines Anwendungsservers zu laufen!

Was ist der Unterschied zwischen diesen Konfigurationsdateien? Nun, es kann viel sauberer sein, weil alle Ihre Anwendungen ihre Konfiguration von am gleichen Ort bekommen können. Wenn sie Konfigurationsinformationen (z. B. Datenbankstandorte) teilen müssen, dann kann dies einmal in JNDI definiert werden. Angenommen, Sie haben Datenbankserver verschoben: Sie müssen sich nicht an die unzähligen Konfigurationsdateien mit dem Speicherort erinnern. Sie gehen nur zu dem einen Ort: JNDI.

3

JNDI ermöglicht die Vereinfachung eines Ressourcenkonstrukts in nur Name. So, es ist viele Details Gruppe in 1 für die Bequemlichkeit/Sicherheit/etc. (Auch bekannt als Abstraktionsschicht)

zu realisieren: setzen eine Eigenschaftsliste auf, die Schnittstelle zu den vordefinierten Feldern in dem JNDI-Kontext entspricht.(Diese Eigenschaften die Einstellungen für die jndi Ausführung angeben, aber * nicht die Suche Name)

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*"); 

ideal, eine spezialisierte Funktion existieren würde ein LDAP-Verzeichnis zu halten, DNS, usw., die in Ihrer Organisation (so eine einheitliche Single Mapping gesetzt Dienste alle, die Verringerung Diskrepanzen)

Liste der JNDI Dienstleister: https://www.ibm.com/support/knowledgecenter/en/SSVSD8_8.4.1/com.ibm.websphere.dtx.adapjndi.doc/concepts/c_jndi_JNDI_Service_Providers_.htm

9

JNDI ist eine API verwendet, um das Verzeichnis zugreifen und Namensdienste (dh die Mittel, mit denen Namen zugeordnet sind, Objekte). Die Zuordnung eines Namens zu einem Objekt wird Bindung genannt.

Ein grundlegendes Beispiel für einen Namensdienst ist DNS, der Computernamen IP-Adressen zuordnet.

Mithilfe von JNDI können Anwendungen benannte Java-Objekte eines beliebigen Typs speichern und abrufen.

Im Kontext von Java kann dies in Konfigurationsdateien verwendet werden, in denen keine Umgebungsvariablen fest programmiert werden sollen.

Frühling Beispiel:

Frühling Kontextdatei

<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 Kontextdatei

<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"/>