Frage Was ist der Zweck von JNDI?


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


75
2017-08-29 08:03


Ursprung


Antworten:


JNDI ist das Java Naming und Directory Interface. Es wird verwendet, um die Anliegen der Anwendung zu trennen Entwickler und die Anwendung Bereitsteller. 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.

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


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 oder den Benutzernamen oder das Passwort zu lesen ist. Das ist im Container konfiguriert.

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


96
2017-08-29 08:21



JNDI ist ein sehr leistungsfähiger Mechanismus zum Organisieren von Konfigurationsinformationen und Dienstleistungen entdecken und hören über die Benutzung des EventContext. In JNDI können Sie nachschauen und zuhören irgendein Objekt (nicht nur DataSources), vorausgesetzt, Ihr JNDI-Dienstanbieter unterstützt dies.

Natürlich ist das einzige Problem, einen JNDI-Dienstanbieter zu haben; Das Tolle daran ist, dass es überraschend einfach ist, selbst zu rollen. Nach allem, was Sie codieren können jede Java-Instanz in XML Verwenden der JavaBeans XMLEncoder und XMLDecoder: 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 bekommen können der gleiche Platz. Wenn sie Konfigurationsinformationen (z. B. Datenbankstandorte) teilen müssen, dann Dies kann 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.


26
2017-08-29 17:23



JNDI ist eine API, die verwendet wird, um auf die Verzeichnis- und Benennungsdienste zuzugreifen (d. H. Die Mittel, mit denen Namen Objekten zugeordnet sind). Die Zuordnung eines Namens zu einem Objekt wird Bindung genannt.

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

Mit JNDI können Anwendungen benannte Java-Objekte beliebigen Typs speichern und abrufen.

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

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

9
2018-03-28 12:41



JNDI ermöglicht die Vereinfachung eines Ressourcenkonstrukts in nur ein Name. Also, es sind viele Details Gruppe in 1 für Bequemlichkeit / Sicherheit / etc. (aka Abstraktionsschicht)

um festzustellen: Richten Sie eine Eigenschaftenliste ein, die den vordefinierten Feldern in der Jndi Context Interface entspricht. (Diese Eigenschaften geben die Einstellungen für die Ausführung von jndi an; aber * nicht den Namen der Suche)

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

Idealerweise würde eine spezialisierte Funktion existieren, um ein LDAP-Verzeichnis, DNS usw. in Ihrer Organisation zu verwalten (so dass ein einheitliches einzelnes Mapping-Set alle Dienste bereitstellt und Diskrepanzen reduziert).

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


3
2018-06-13 02:31