Wie können Sie die Verwendung von JNDI anhand eines Beispiels realisieren, wenn dies möglich ist?
Wie können Sie die Verwendung von JNDI anhand eines Beispiels realisieren, wenn dies möglich ist?
Antworten:
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 .
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 DataSource
s) 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 XML
Verwendung der Java Beans XMLEncoder
und 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.
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"/>
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