5 Stimmen

Wie spritzt Tomcat den JNDI-Komponentenlokal-Kontext ein?

In Tomcat können Sie Ressourcen (JDBC-Verbindung, Javax-Mail-Sitzungen usw.) in context.xml angeben, sie in web.xml referenzieren und sie dann in Java wie folgt laden:

Context ctx = new InitialContext();
DataSource dataSource = (DataSource)ctx.lookup("java:/comp/env/jdbc/myDB");

Mich interessiert, welcher magische Voo-Doo hier passiert! Ich hätte erwartet, dass der InitialContext-Konstruktor mit einer Hashtable oder einem anderen Objekt injiziert werden muss, um ihn damit mit allem zu füllen, was in context.xml und web.xml definiert ist. Aber es handelt sich um einen Konstruktor ohne Argumente!!!

Also frage ich: Was macht Tomcat, um das "fehlende Glied" zwischen den 2 XML-Dateien und dem Konstruktor ohne Argumente des InitialContext zu füllen, so dass der DataSource magischerweise über die ctx-Instanz verfügbar ist? Danke im Voraus!

11voto

Mark Thomas Punkte 16031

Es gibt mehrere Teile des Magie-Voodoo, wie du es beschreibst.

Zuallererst ruft Tomcat früh im Startup-Prozess folgendes auf:

System.setProperty(javax.naming.Context.INITIAL_CONTEXT_FACTORY,
        "org.apache.naming.java.javaURLContextFactory");

Dies sagt dem JVM, Tomcats eigene Factory zur Erstellung von Instanzen von InitialContext zu verwenden.

Der zweite Teil basiert darauf, dass jede Webanwendung ihren eigenen Klassenlader hat und dass alle Benutzercode mit diesem Klassenlader als Thread-Kontextklassenlader ausgeführt wird. Daher kann Tomcat beim Erstellen eines neuen InitialContext den Thread-Kontextklassenlader betrachten, um festzustellen, welche Webanwendung die Anforderung stellt.

Von dort aus ist es ein einfacher Prozess, das neue InitialContext-Objekt mit dem richtigen Satz von JNDI-Ressourcen für die aktuelle Anwendung zu verbinden.

7voto

Bhesh Gurung Punkte 49812

Beim Start liest Tomcat context.xml und erstellt alle dort definierten Ressourcen und registriert sie im JNDI-Kontext. Der Code, den du gepostet hast, ist nur die Art und Weise, wie man auf diese Ressourcen zugreifen kann.

In web.xml (das beim Bereitstellen der Webanwendung gelesen wird) sind die definierten Ressourcen nicht neu. Diese sind lokal für die Webanwendung, zeigen aber auf die in context.xml definierten Ressourcen. Der Zweck davon ist, dass der Java-Code in deiner Webanwendung die Serverressourcen indirekt abrufen würde.

4voto

Durandal Punkte 5418

Laut der Tomcat Dokumentation:

Der InitialContext wird konfiguriert, wenn eine Webanwendung zuerst bereitgestellt wird, und steht Webanwendungskomponenten zur Verfügung (für Lesezugriff).

Wenn ich raten müsste, lesen sie einfach den statischen Speicherort Ihrer Konfigurationsdateien ($CATALINA_BASE/conf/server.xml usw.) und stellen diese für jede Webanwendung bereit, wenn sie bereitgestellt werden. Die Dokumentation behandelt auch ausführlich jeden Typ des Eintrags für jede Datei und wie jeder behandelt wird.

Wenn man den Quellcode für IntialContext.java betrachtet, ist Ihre Vermutung über eine Hash-Tabelle korrekt, es hat tatsächlich einen Konstruktor dafür und speichert Einträge anscheinend in einer Hash-Tabelle, myProps.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X