Вы всегда можете обратиться к ресурсам в вашем приложении напрямую по их имени 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 имеет то преимущество, что отделяет роль developer от роли deployer, Другими словами, как разработчик, вам не нужно знать, как на самом деле называются ваши требуемые ресурсы в производственном процессе, и, как парень, развертывающий приложение, у вас будет хороший список имен для сопоставления с реальными ресурсами.