2013-11-10 3 views
4

Я читаю в настоящее время главу resource injection in the java-ee tutorial и я не могу постигнуть путь один грим использование ресурса после того, как внедрить его, или, другими словами, каким образом один имеет доступ к нему:доступ к впрыскивается ресурс в EJB

поле основе Инъекции:

public class SomeClass { 
    @Resource(name="customerDB") 
    private javax.sql.DataSource myDB; 
... 
} 

Метод на основе инъекций:

public class SomeClass { 

    private javax.sql.DataSource myDB; 
... 
    @Resource(name="customerDB") 
    private void setMyDB(javax.sql.DataSource ds) { 
     myDB = ds; 
    } 
... 
} 

основе классов Injection:

@Resource(name="myMessageQueue", 
       type="javax.jms.ConnectionFactory") 
public class SomeMessageBean { 
... 
} 

Я полагаю, в class-based возможно только с lookup (как именно?). Однако в первых двух случаях, как использовать ресурс, особенно если он определен дополнительно с именем?

UPDATE:

В случае это не совсем понятно, что мой вопрос относится к следующим темам:

1) в field- или method-based injection я получить доступ к ресурсу, как:

myDB.someMethod(); 

или

customerDB.someMethod(); 

Если первое правильно, в чем цель name? Могу ли я получить к нему доступ также с lookup?

2) Как я к нему обращаюсь в class-based injection? Я полагаю, что с lookup, но по какому пути?

+0

Вы используете инъекционные поля внутри всех методов бина, как вы бы использовать любое другое поле в любом другом классе Java. Я не понимаю ваш вопрос. –

+0

@JBNizet: Я обновил вопрос. – arjacsoh

ответ

4

Если первое право, в чем цель имени? Могу ли я получить к нему доступ также с помощью поиска?

Большая трудность и является основной причиной путаницы в JNDI и массово перегруженных @Resource аннотацию, что name относится к локальному ENC пространства, который связан с компонентом (в случае EJB фасоли, это единственный Bean). Вы можете получить доступ к этому пространству из исходного контекста, используя java:comp/env.

'name' - это имя TARGET и имя SOURCE. В качестве целевого имени он не ищет вещи, а хранит что-то в ENC. Если что-то уже было отображено в ENC, например. через XML, то он служит в качестве имени источника (он используется для поиска из ENC).

«поиск», однако всегда делает то, что он говорит; он выполняет поиск в пространстве имен «GLOBAL» JNDI, например. java:app/, java:module/ и т. Д. Обратите внимание, что я помещаю глобальное значение между кавычками, так как даже эти пространства имен по-прежнему относятся к местоположению, из которого выполняется поиск JNDI.

Как я обращаюсь к нему в классной инъекции?

На основе классов - эквивалент аннотации синтаксиса XML для сопоставления чего-либо в ENC компонента. Это не ИМХО хорошо переводит на современные методы программирования. После того, как вы ввели что-то в ENC, вы можете посмотреть его снова через InitialContext, используя вышеупомянутое пространство java:comp/env.

E.g. учитывая

@Resource(name="myMessageQueue", 
       type="javax.jms.ConnectionFactory") 
public class SomeMessageBean { 
... 
} 

Вы можете сделать следующий поиск из любой точки в пределах вызова цепи методы к SomeMessageBean, До следующего вызова компонента Java EE (который устанавливает новый контекст ENC):

try { 
    ConnectionFactory connectionFactory = new InitialContext().lookup("myMessageQueue"); 
} catch (NamingException e) { 
    ... 
} 

В целом @Resource представляет собой попытку несколько модернизировать древний пред-курсор для инъекций в Java EE, но из-за унаследованных проблем он добавляет тонны сложности. ИМХО, было бы лучше, если бы весь Java EE переместился на @Inject, который имеет гораздо более ясную и менее перегруженную семантику.

Смотрите также: Declaring @Resource and @EJB at the class level in Java EE6

+0

+1 для объяснения. Поэтому '@Resource (name =" foo ")' на самом деле является ярлыком для '@Resource (name =" foo ", lookup =" foo ")', правильно? И, помимо ввода поля/метода, он также создает «локальный» псевдоним в ENC для глобального ресурса «foo», правильно? –

+0

Мне также кажется странным, что «имя» и «поиск» полностью соответствуют той же цели. – arjacsoh

+0

@JBNizet в основном, но просто '@Resource (name =" foo ")' не будет искать 'foo' (как запись JNDI верхнего уровня), а только' java: comp/env/foo', если он есть. При указании как 'name', так и' lookup' его действительно сродни псевдониму при использовании на уровне класса. Из-за множества перегрузок '@ Resource' и иногда двусмысленных значений довольно сложно запомнить все 100% правильно. –

0

Чтобы ответить на ваш первый вопрос:

@Resource(name="customerDB") 
private javax.sql.DataSource myDB; 

означает приведенный выше код: впрыснуть частное поле myDB с DataSource по имени "customerDB". Имя поля и имя ресурса - это две совершенно разные вещи. Имя переменной зависит от вас, а имя ресурса должно иметь имя источника данных, настроенного в JNDI.

И, конечно, вы используете myDB для доступа к полю, потому что это то, что называется полем. Аннотации - это просто метаданные, связанные с обычными классами Java, полями и методами. Они не меняют работу Java: для доступа к полю вы используете имя поля. Не имя аннотации Java EE, связанное с этим полем.

Что касается вашего второго вопроса, чтобы быть справедливым, я понятия не имею, что такое метод инъекции на основе класса, и когда это может быть полезно.

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