2014-01-04 3 views
1

Я хочу понять, какова роль @EJB и что делает контейнер во время инъекции.Какова роль аннотации @EJB

Я новичок в Java EE, и на данный момент я использую инъекции зависимостей для использования EJB, потому что я научился с помощью этого метода.

К примеру, у меня есть локальный интерфейс

@Local 
public interface MyInterface 

тогда я реализую этот интерфейс

@Stateless 
public class MyInterfaceImpl implements MyInterface 

и когда я хочу использовать EJB, я пишу

@EJB 
MyInterface ejb; 

Во-первых, я не понимаю, что происходит в контейнере во время инъекционных зависимостей.

Кроме того, почему лучше (или не может быть), чтобы использовать интерфейс для вызова EJB, тогда как использовать EJB (который, по моему мнению, будет более прямой)

MyInterfaceImpl ejb; 
ejb.myMethod(); 

ответ

2
  1. Когда контейнер видит ваш @EJB знает, что он должен найти правильную реализацию интерфейса EJB, создать экземпляр этого компонента (версия отражения new MyInterfaceImpl()), вызвать его методы жизненного цикла, а затем сделать его доступным для вас.
    Он делает все это для вас - вы просто сосредоточены на бизнес-логике и зависимостях, а не на конфигурации, создании экземпляров или управлении жизненным циклом зависимого EJB.

  2. Можно непосредственно ввести класс-конструктор EJB (@LocalBean - вид без интерфейса). Для некоторых простых случаев этого достаточно, и вы можете быть счастливы с этим. Тем не менее, для других примеров в реальной жизни вам может понадобиться поменять реализацию бизнес-интерфейса EJB во время развертывания. Эта реализация может отличаться от развертывания до развертывания. Hardcoding класс-конструктор в вашем коде, как вы показали, заставляет вас тесно связать с реализацией интерфейса - т. Е. Вы не можете поменять его без перекомпиляции кода.

+0

Спасибо, Петр. Если у меня есть интерфейс и 3 реализации, как контейнер может знать EJB? Я полагаю, используя параметры аннотации. Но в этом случае нам нужно перекомпилировать код для замены реализации, не так ли? – federem

+1

Да, вы правы, если используете параметры аннотаций, такие как beanName или beanInterface. Но помните, что вы можете сделать то же самое в дескрипторе развертывания ('ejb-jar.xml'). Это чисто зависящее от развертывания. Более того, представьте, что у вас есть EAR (или WAR), и у вас есть интерфейс и реализации в разных JAR-системах внутри него. Затем вы можете решить, какие JAR станут частью вашего EAR во время развертывания - чтобы убедиться, что только одна реализация EJB-интерфейса находится в EAR/WAR. –

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