Ответ 1
В корневом контексте пространства имен является связыванием с именем "comp" , который привязан к зарезервированному поддереву для привязок к компонентам. имя "comp" не подходит для компонента. Нет других привязок на корневой контекст. Однако корень контекст зарезервирован для будущего расширение политики, в частности для именования ресурсов, которые связаны не самому компоненту, но другому типы объектов, таких как пользователи или ведомства. Например, будущее политики могут позволить вам назвать пользователей и организациями/отделами, используя такие имена, как "java: user/alice" и. "Java: орг/инженерия"
В контексте "comp" есть два привязки: "env" и "UserTransaction". Имя "env" привязано к поддереву который зарезервирован для компонента связанные с окружающей средой привязки, поскольку определяемый его дескриптором развертывания. "env" не подходит для окружающей среды. J2EE рекомендует (но не требует) следующая структура для "env" Пространство имен.
Итак, привязка, которую вы сделали от spring или, например, из дескриптора контекста tomcat, по умолчанию по умолчанию: java: comp/env/
Например, если ваша конфигурация:
<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="foo"/>
</bean>
Затем вы можете получить к нему доступ напрямую, используя:
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/foo");
или вы можете сделать промежуточный шаг, поэтому вам не нужно указывать "java: comp/env" для каждого ресурса, который вы извлекаете:
Context ctx = new InitialContext();
Context envCtx = (Context)ctx.lookup("java:comp/env");
DataSource ds = (DataSource)envCtx.lookup("foo");