Пространство имен java:comp/env/
иногда является мало понятной особенностью.Это пространство имен соответствует тому, что называется Enterprise Naming Context
(ENC).
Это похоже на частную "хэш-карту", связанную с каждым компонентом, причем весь веб-модуль обрабатывается как один компонент, а отдельные компоненты EJB-компонентов являются компонентами.а также.
Вы используете это частное пространство имен в основном для псевдонимов .Если вы отображаете что-то в «ejb / PlaceBid», то весь (вспомогательный) код может использовать «ejb / PlaceBid», и в одном глобальном местоположении (в данном случае сервлет, но также может быть XML) вы можете определить, что именно отображаетсяк этому.Если весь код перешел непосредственно к java:global/...
, тогда это имя может содержать десятки жестко закодированных зависимостей.
Итак, вы должны использовать это, если вам нужно дополнительное перенаправление.
Некоторыедругие вещи, чтобы отметить:
1.С помощью EJB SessionContext вы можете напрямую ссылаться на это пространство имен, например:
PlaceBid placeBid = (PlaceBid)sessionContext.lookup("ejb/PlaceBid");
Здесь "ejb / PlaceBid" - это относительное имя в ENC.
2.Как уже упоминалось, ENC является закрытым для каждого компонента.Разные EJB могут иметь заданное относительное имя, отображаемое по-разному.Таким образом, context.lookup("java:comp/env/ejb/PlaceBid")
может возвращать что-то другое в зависимости от того, из какого компонента вы выполняете вызов.
3.Исторически ENC предшествовал тому, что мы сейчас называем инъекцией .В некотором смысле, когда вы указали отображение в XML, вы «внедрили» что-то в частную «хэш-карту», связанную с этим компонентом.Современная версия внедряется в поля, конструкторы или свойства (сеттеры), но старая версия внедряется в «ключи».
Даже в EJB3.1 исторический механизм «инъекции» все еще активен под капотом.Если вы выполняете, казалось бы, нормальную инъекцию, используя @EJB для поля, это также автоматически создает запись в ENC JNDI.Например,
package test;
@Stateless
public class MyBean {
@EJB
private MyService myService;
}
В этом случае все, что вводится в myService, также сохраняется в ENC под именем java:comp/env/test.MyBean/myService
.Чтобы завершить ссылку аннотацией @EJB, которую вы использовали в сервлете: вы можете дополнительно использовать атрибут name
, чтобы указать имя, под которым хранится ссылка в ENC:
@Stateless
public class MyBean {
@EJB(name = "ejb/PlaceBid")
private MyService myService;
}
Небольшой счетчик-интуитивно, но в большинстве случаев атрибут name
здесь, таким образом, не является чем-то, что указывает на источник , откуда берется объект для инъекции, но он используется как target в ENC для инъекций.