Почему предпочтительнее поиск JNDI над внедрением EJB для сессионного компонента с состоянием?

Я довольно новичок в Java EE и не могу понять, почему я предпочитаю поиск JNDI вместо внедрения для сессионного компонента Stateful? (Это то, что я прочитал на слайде урока об этом)

2 ответа

Решение

В общем, поиск JNDI выполняется, когда вы находитесь в контексте, который не поддерживает внедрение.

Если вы находитесь в таком контексте, есть еще несколько причин. Во-первых, когда bean-объект, который вы вводите, будет сериализован, и он не знает, как выполнить повторную инъекцию после десериализации (это происходит для собственных управляемых bean-компонентов JSF при использовании состояния на клиенте).

Эта последняя причина может быть причиной, которую учитель имел в виду. Сессионные компоненты с сохранением состояния могут быть пассивированы (после чего они будут сериализованы), и, возможно, в некоторых случаях вы не захотите, чтобы внедренный ресурс также был сериализован. В этом случае вы не будете хранить ресурс в переменной экземпляра, а будете запрашивать новый у JNDI каждый раз, когда он вам понадобится.

Другая причина заключается в том, что с помощью JNDI вы можете программно принимать решение о том, какой bean-компонент следует извлекать, но это не относится к сессионным компонентам с сохранением состояния и сохраняется для всех типов инъекций где угодно.

Обратите внимание, что вышеизложенное в основном касается внедрения INTO сессионного компонента с сохранением состояния. Как правильно говорит Мильжен выше, существует также вопрос о введении сессионного компонента с сохранением состояния во что-то. Если вы также не назначите область действия для SFSB (через @SessionScope, @RequestScope и т. Д. CDI), то внедрение в сервлет или другой общий ресурс (например, управляемый компонент уровня приложения) предоставит один и тот же SFSB всем пользователям, чего вы, скорее всего, не хотите.

Если вы не можете использовать CDI (например, возможно, вы просто не знаете, что он существует), то получение SFSB через JNDI - это обходной путь. Если вы хотите сохранить состояние дольше, чем один вызов метода, вам придется хранить его где-нибудь, например, в сеансе HTTP.

Предположим, вы пытаетесь получить ссылку на SFSB, например, в сервлете. Какие у вас варианты?

а) внедрение EJB с аннотацией @EJB

б) JNDI поиск

Вариант а) даст вам ту же ссылку, которая будет распространяться на все вызовы конкретного сервлета. Вероятно, или определенно, не то поведение, которое вы хотите. Вариант б) - ваш выбор, потому что вы можете получить новую ссылку SFSB на запрос и сохранять ее только до тех пор, пока не закончите вызов.

Другие вопросы по тегам