Для чего используется ссылка на ресурс в web.xml?

112

Мне просто интересно, когда и зачем вы определяете <resource-ref>элемент в своем web.xmlфайле?

Я бы подумал, что он будет определен на вашем веб-сервере / сервере приложений с помощью JNDI, а затем искать ссылку JNDI в вашем коде Java?

Определение ресурса-ссылки кажется мне немного избыточным, и я не могу придумать, когда оно может быть полезно. Пример:

<resource-ref>
  <description>Primary database</description>
  <res-ref-name>jdbc/primaryDB</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>CONTAINER</res-auth>
</resource-ref>
JMM
источник

Ответы:

156

Вы всегда можете ссылаться на ресурсы в своем приложении напрямую по их имени JNDI, настроенному в контейнере, но если вы это сделаете, по сути, вы подключаете специфичное для контейнера имя в свой код. У этого есть некоторые недостатки, например, если вы когда-нибудь захотите изменить имя позже по какой-либо причине, вам нужно будет обновить все ссылки во всех ваших приложениях, а затем перестроить и повторно развернуть их.

<resource-ref>вводит еще один уровень косвенности: вы указываете имя, которое хотите использовать в web.xml , и, в зависимости от контейнера, обеспечиваете привязку в файле конфигурации для конкретного контейнера .

Итак, вот что происходит : допустим, вы хотите найти java:comp/env/jdbc/primaryDBимя. Контейнер обнаруживает, что в web.xml есть <resource-ref>элемент jdbc/primaryDB, поэтому он будет изучать специфичную для контейнера конфигурацию, которая содержит нечто подобное следующему:

<resource-ref>
  <res-ref-name>jdbc/primaryDB</res-ref-name>
  <jndi-name>jdbc/PrimaryDBInTheContainer</jndi-name>
</resource-ref>

Наконец, он возвращает объект, зарегистрированный под именем jdbc/PrimaryDBInTheContainer.

Идея состоит в том, что указание ресурсов в файле web.xml имеет то преимущество, что роль разработчика отделена от роли развертывателя . Другими словами, как разработчику вам не нужно знать, какие ресурсы на самом деле вызываются в производственной среде, а как разработчик приложения у вас будет хороший список имен для сопоставления с реальными ресурсами.

Candiru
источник
6
ИМХО, это выходит за рамки разделения ролей. Идея состоит в том, что вы не можете предположить, что имя jndi доступно на сервере, поэтому вам нужен способ сопоставить имя, используемое в вашем приложении, с «настоящим» именем JNDI, выбранным разработчиком.
Паскаль Тивент
3
Это должно быть элементарно, поскольку я не могу найти его в Google, но если я хочу найти «java: comp / env / jdbc / primaryDB», то почему имя res-ref-name «jdbc / primaryDB»?
Торбен
4
Насколько я знаю, элемент «jndi-name» НЕ является частью стандартного файла web.xml, а является частью дескрипторов развертывания конкретных поставщиков.
Рамон Кьяра
2
@RaviParekh, он упомянул «специфичную для контейнера конфигурацию», это может быть jboss-web.xml или weblogic.xml или любой другой файл дескриптора развертывания, специфичный для поставщика
abhihello123 01
1
Можем ли мы связать это с котом? Я имею в виду источник данных, определенный в context.xml в tomcat и resource-ref в web.xml
Атул