@Inject, @EJB, @Local, @Remote, @localbean и т. Д. ...: confused?JAVA

Программисты JAVA общаются здесь
Anonymous
@Inject, @EJB, @Local, @Remote, @localbean и т. Д. ...: confused?

Сообщение Anonymous »

У меня есть следующая конфигурация: < /p>
  • 1 ухо на одном GF, содержащем 2 ejb-jars с компонентами EJB. < /li>
    < li> 1 война на другом сервере Glassfish ( => Другое JVM ), содержащий веб -компоненты, получающие доступ к компонентам EJB.

У меня есть 2 бизнес-услуги EJB в каждом EJB-Jar моего уха, и все они развиваются так: < /p>

Код: Выделить всё

@Remote
public interface ServiceAItf {
...
}

@Stateless
@Local
public class ServiceAImpl implements ServiceAItf {
...
}
В моей войне я получаю доступ к компонентам EJB через явную "initialContext.lookup" [/b] в удаленном интерфейсе.
В моем ухе я очень запутался в лучшей практике для инъекций, с точки зрения производительности, архитектуры и т. Д.
У меня есть следующие вопросы:

Как вы можете видеть, я объявил аннотацию "@local" < /b> в реализации службы без определения локального интерфейса. Это правильно? По крайней мере, у меня нет ошибок при развертывании. Но, может быть, мне следует использовать аннотацию "@localbean"
? Я полагаю, что аннотация "@LocalBean" просто позволяет вызывать реализацию напрямую как "Local" EJB, но вы должны использовать реализацию в своем коде, как это: < /p>

Код: Выделить всё

  @Stateless
@Local
public class ServiceBImpl implements ServiceBItf {
@EJB
private ServiceAImpl serviceA;
...
}
< /code>
< /li>
   Какой лучший способ ввести один ejb в другой? < /b>
Это работает так : < /p>
  @Stateless
@Local
public class ServiceBImpl implements ServiceBItf {
@EJB
private ServiceAItf serviceA;
...
< /code>
} < /p>
< /li>
< /ul>
Но из того, что я заметил, «Servicea» вводила является удаленным прокси, в то время как он находится в том же JVM в том же файле уха. Поэтому я полагаю, что окажет влияние на производительность. Вот почему я попытался ввести услугу таким образом: < /p>
@Stateless
@Local
public class ServiceBImpl implements ServiceBItf {
@Inject
private ServiceAItf serviceA;
...
}
< /code>
Но это не работает в GF, у меня есть следующее исключение: < /p>
WELD-001408 Unsatisfied dependencies for type [...] ...
< /code>
Я затем попытался создать локальный интерфейс, и инъекция с помощью аннотации "@Inject" работает, когда оба сервиса < /p>
Даже если я создаю локальный интерфейс, как этот, сервис не вводится через аннотацию  "@inject" [/b], но null:  [b]@Local
public interface ServiceALocalItf {
...
}
Я читаю много статей, где настоятельно рекомендуется использовать "@inject" [/b] вместо "@ejb" , когда это для локального вызова. Это приводит меня к следующему вопросу: в каком случае рекомендуется "@Local" EJB. Приходите к следующему выводу: < /p>
Для каждой услуги я создаю "@local" < /b> и "@remote "
Интерфейс. < /li> От войны до ejb-jar of char, сделайте поиск JNDI в удаленный интерфейс. , сделайте инъекцию через "@ejb" к местному интерфейсу. "@Inject" на локальный интерфейс. < /Li>
< /ul>
Что вы об этом думаете? Это правильно?

Подробнее здесь: https://stackoverflow.com/questions/736 ... c-confused

Вернуться в «JAVA»