2013-07-10 2 views
4

В Tomcat, вы можете указать ресурсы (JDBC соединения, Javax почты сессий и т.д.) в context.xml, ссылаться на них в web.xml, а затем загрузить их в Java, как так:Как Tomcat вводит компонент JNDI-локальный контекст?

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

Я м интересуется тем, что происходит в волшебном ву-ду! Я бы ожидал, что нужно вставить конструктор InitialContext с помощью хеш-таблицы или какого-либо другого объекта, тем самым введя его все, что определено в context.xml и web.xml. Но это конструктор no-arg !!!

Так я спрашиваю: что Tomcat сделать, чтобы заполнить «недостающее звено» между 2 XML-файлами и InitialContext конструктора без аргументов, так что DataSource магически доступен из экземпляра ctx? Заранее спасибо!

+0

Это может помочь вам понять магию вуду за тем, как работает конструктор InitialContext без каких-либо параметров: http://www.tugay.biz/2016/07/extending-hello-jndi-example.html –

ответ

4

В соответствии с Tomcat documentation:

InitialContext сконфигурирован как веб-приложение изначально развернут, и становится доступным для компонентов веб-приложений (для доступа только для чтения).

Если бы я должен был догадаться, что они просто прочитать статическое расположение конфигурационных файлов ($CATALINA_BASE/conf/server.xml и т.д.) и предоставлять его для каждого веб-приложения, как они развернуты. В документации также подробно описывается каждый тип записи для каждого файла и порядок обработки каждого из них.

Исследуя исходный код для IntialContext.java, ваша догадка о HashTable верна, у него есть конструктор для одного и он хранит записи в HashTable, myProps.

+0

Спасибо @MagicMan (+1) - пожалуйста, см. мой вопрос под ответом Бэша Гурунга - у меня есть тот же вопрос для вас! Еще раз спасибо! – IAmYourFaja

+2

Он использует различные фабричные классы для создания экземпляров ваших ресурсов. Для источников данных это будет [BasicDataSourceFactory.java] (http://www.docjar.com/html/api/org/apache/commons/dbcp/BasicDataSourceFactory.java.html). При запуске Tomcat он принимает ваши аргументы из context.xml и сопоставляет их с правильной фабрикой. Вы также можете создать свой собственный [Фабричные Фабрики] (http://tomcat.apache.org/tomcat-7.0-doc/jndi-resources-howto.html#Adding_Custom_Resource_Factories), если у вас есть определенные потребности в ресурсах, которые Tomcat не предоставляет по умолчанию. – Durandal

+0

Еще раз спасибо @MagicMan, но я до сих пор не думаю, что я объясняю, что именно я ищу. Теперь я понимаю, что Tomcat имеет парсеры, которые читают 'context.xml' и соответствуют записям ресурсов на правильной фабрике. Но как эти ресурсы могут быть отображены/введены/связаны с моим вызовом 'new InitialContext()'? Другими словами, что такое конструктор конструктора noCargString() ', чтобы прочитать эти записи ресурсов и вернуть их клиенту? Еще раз спасибо! – IAmYourFaja

6

При запуске tomcat читает context.xml и создает все ресурсы, определенные там, и регистрирует их с помощью контекста JNDI. Код, который вы опубликовали, - это просто способ получить эти ресурсы.

В web.xml (который читается при развертывании веб-приложения), определенные ресурсы не новы. Они локальны для веб-приложения, но указывают на ресурсы, определенные в context.xml. Целью этого является то, что код Java в вашем веб-приложении будет искать косвенные ресурсы сервера.

+0

Спасибо @Bhesh Gurung (+1) - какие классы/методы использовал Tomcat для регистрации ресурсов (определенных в context.xml) со своим собственным контекстом JNDI? Как это произойдет? Как это выглядит (по коду)? Еще раз спасибо! – IAmYourFaja

+1

Я не уверен, какие классы использует tomcat, потому что нужно было бы вникнуть в исходный код tomcat. Но это то, что вы планируете, тогда я думаю, что было бы полезно сначала получить концепцию [JNDI] (http://docs.oracle.com/javase/tutorial/jndi/overview/index.html). –

+0

Если вы найдете источник, то основным классом будет 'org.apache.catalina.startup.Bootstrap'. –

9

Есть несколько частей магического вуду, как вы его описываете.

Прежде всего в начале процесса запуска Tomcat называет:

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

Это говорит JVM использовать собственный завод Tomcat для создания экземпляров InitialContext.

Вторая часть основана на том, что каждое веб-приложение имеет свой собственный загрузчик классов и что весь код пользователя выполняется с этим загрузчиком классов, установленным в качестве загрузчика классов контекста потока. Поэтому, когда создается новый InitialContext, Tomcat может посмотреть загрузчик класса контекста потока, чтобы определить, какое веб-приложение выполняет запрос.

Оттуда простой процесс подключения нового объекта InitialContext с правом набора ресурсов JNDI для текущего приложения.

+0

«это простой процесс» - все просто, когда оно его понимает :-) – sleske

+0

Можете ли вы рассказать мне, какую ценность Tomcat будет использовать для Context.PROVIDER_URL? –

Смежные вопросы