Was ist der Zweck von JNDI

90

Wie können Sie die Verwendung von JNDI anhand eines Beispiels realisieren, wenn dies möglich ist?

Ajay
quelle
3
Sie können einen persönlichen Blog-Beitrag für Anwendungsfälle überprüfen: tshikatshikaaa.blogspot.com/2013/01/…
Jérôme Verstrynge
@JVerstry +1 für den Hinweis auf einen Artikel, der sich mit verwandten LDAP, JCA und CCI befasst.
Ajay
Schauen Sie sich diesen SO-Thread an
Aniket Thakur

Antworten:

109

JNDI ist die Java-Namens- und Verzeichnisschnittstelle. Es wird verwendet , um die Anliegen der Anwendung zu trennen Entwickler und die Anwendung deployer . Wenn Sie eine Anwendung schreiben, die auf einer Datenbank basiert, sollten Sie sich keine Gedanken über den Benutzernamen oder das Kennwort machen müssen, um eine Verbindung zu dieser Datenbank herzustellen. Mit JNDI kann der Entwickler einer Datenbank einen Namen geben und sich darauf verlassen, dass der Bereitsteller diesen Namen einer tatsächlichen Instanz der Datenbank zuordnet.

Wenn Sie beispielsweise Code schreiben, der in einem Java EE-Container ausgeführt wird, können Sie diesen schreiben, um die Datenquelle mit dem JNDI-Namen "Database" abzurufen:


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

Beachten Sie, dass hier nichts über den Datenbanktreiber, den Benutzernamen oder das Kennwort steht. Das ist im Container konfiguriert.

JNDI ist nicht auf Datenbanken (JDBC) beschränkt. Alle Arten von Diensten können benannt werden. Weitere Informationen finden Sie im Oracle- Tutorial .

Simon Nickerson
quelle
10
Wie unterscheidet sich JNDI in diesem Beispiel im Bild davon, Datenbanknamen in eine XML-Konfigurationsdatei oder eine Eigenschaftendatei zu setzen und von dort aus zu lesen?
Ajay
11
Zunächst müssten Sie das Kennwort in Ihrer Konfigurationsdatei im Klartext speichern. Zweitens müssen Sie die Konfiguration an mehreren Stellen aktualisieren, wenn mehrere Apps auf dieselbe Datenbank verweisen und sich etwas an der Datenbankkonfiguration ändert.
Simon Nickerson
1
Wie hilft JNDI hier?
Ajay
1
Dies sollte alles enthalten, was Sie über JNDI wissen müssen, sei es in einem J2EE-Kontext oder einem JavaSE-Kontext. javaworld.com/javaworld/jw-04-2002/jw-0419-jndi.html
Nico
5
@ SimonNickerson Hi!. Ich lerne etwas über JNDI. Dies ist eine gute Antwort, aber wenn Sie die Frage "Wie können Sie die Verwendung von JNDI realisieren?" Bemerken. dann sieht es unvollendet aus. Sie haben die Realisierung aus Sicht des Entwicklers beschrieben. Wie wäre es mit der Perspektive des Bereitstellers?
lxknvlk
30

JNDI ist ein sehr leistungsfähiger Mechanismus zum Organisieren von Konfigurationsinformationen sowie zum Erkennen und Abhören von Diensten mithilfe von EventContext. In JNDI können Sie jedes Objekt (nicht nur DataSources) suchen und anhören , vorausgesetzt, Ihr JNDI-Dienstanbieter unterstützt es.

Das einzige Problem ist natürlich, einen JNDI-Dienstanbieter zu haben. Das Tolle daran ist, dass es überraschend einfach ist, seine eigenen zu rollen. Schließlich können Sie kodieren jede Java - Instanz in XMLVerwendung der Java Beans XMLEncoderund XMLDecoder: Sie müssen nicht auf Lauf innerhalb eines Anwendungsservers verlassen!

Was ist der Unterschied zwischen Konfigurationsdateien? Nun, es kann viel sauberer sein, da alle Ihre Anwendungen ihre Konfiguration vom selben Ort erhalten können . Wenn sie Konfigurationsinformationen (z. B. Datenbankspeicherorte) gemeinsam nutzen müssen, kann dies einmal in JNDI definiert werden . Angenommen, Sie haben Datenbankserver verschoben: Sie müssen sich nicht die Millionen Konfigurationsdateien mit dem Speicherort darin merken. Sie gehen einfach zu dem einen Ort: JNDI.

oxbow_lakes
quelle
Dies ist bei weitem die rundeste Klarstellung - Danke oxbow_lakes! Übrigens, hätten Sie Codezeiger, in denen eine Java-Instanz wie vorgeschlagen codiert wurde?
Rohan Kumar
13

JNDI ist eine API, die für den Zugriff auf die Verzeichnis- und Namensdienste verwendet wird (dh die Mittel, mit denen Namen Objekten zugeordnet werden). Die Zuordnung eines Namens zu einem Objekt wird als Bindung bezeichnet.

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

Mit 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 Sie keine umgebungsspezifischen Variablen fest codieren möchten.

Frühlingsbeispiel:

Spring-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"/>
Ithar
quelle
3

JNDI ermöglicht die Vereinfachung eines Ressourcenkonstrukts in nur einen Namen . Aus Gründen der Bequemlichkeit / Sicherheit / etc. Sind viele Details zu einer Gruppe zusammengefasst . (auch bekannt als Abstraktionsschicht)

zu realisieren: Richten Sie eine Eigenschaftsliste ein, die den vordefinierten Feldern in der Jndi-Kontextschnittstelle entspricht. (Diese Eigenschaften geben die Einstellungen für die JNDI-Ausführung an, * jedoch nicht den Suchnamen.)

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

Im Idealfall gibt es eine spezielle Funktion zum Verwalten eines LDAP-Verzeichnisses, von DNS usw. in Ihrer Organisation (ein einheitlicher einzelner Zuordnungssatz bietet also alle Dienste, wodurch Diskrepanzen verringert werden).

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

ilupper
quelle