EJB 3.1 @LocalBean vs no annotation

Я понимаю разницу между локальным представлением, удаленным представлением и видом без интерфейса. Я просто не понимаю, в чем разница между «no view» (без annotations) и представлением без интерфейса. А также почему я должен аннотировать мой интерфейс с помощью @Local ? Что делать, если я вообще не аннотирую интерфейс, есть ли разница?

Правила (из памяти):

  1. Bean имеет аннотацию @LocalBean -> bean имеет вид без интерфейса
  2. Bean имеет @Local аннотацию -> bean имеет локальный вид
  3. Bean имеет аннотацию @Remote -> bean имеет удаленный вид
  4. Bean не имеет аннотаций вида, но непосредственно реализует интерфейс, который имеет @Local annotation -> bean, имеет локальный вид
  5. Bean не имеет аннотаций вида, но непосредственно реализует интерфейс, который имеет аннотацию @Remote -> bean имеет удаленный вид
  6. Bean не имеет аннотаций вида, но непосредственно реализует интерфейс, который не имеет аннотаций вида -> bean имеет локальный вид
  7. Bean не имеет аннотаций вида и не реализует интерфейсов -> bean имеет вид без интерфейса

Таким образом, использование @LocalBean и отсутствие annotations вообще – оба способа получения представления без интерфейса. Если вам просто нужен вид без интерфейса, то проще всего не комментировать. Если вы не используете какие-либо интерфейсы.

Часть причины @LocalBean существует для добавления представления без интерфейса к компоненту, который также имеет представление интерфейса. Я полагаю, что сценарий, самый верхний в умах авторов спекуляций, был тем, где у вас есть фасоль:

 @Stateless public class UserPreferences { public String getPreference(String preferenceName); public Map getPreferences(); } 

Где бы вы хотели разоблачить оба метода локально, но только более крупнозернистые getPreferences() удаленно. Вы можете сделать это, объявив удаленный интерфейс только с этим методом, а затем просто @LocalBean в classе bean. Без этого вам придется писать бессмысленный локальный интерфейс, чтобы разоблачить оба метода локально.

Или, чтобы посмотреть на это по-другому, @LocalBean существует, потому что есть такая вещь, как представление без интерфейса, а опция no-annotation существует как удобный ярлык.

  • Удаленные EJB: могут быть доступны из удаленных клиентов (клиенты, запущенные на другой JVM, такие как Swing или клиенты JavaFX, которые запускаются на пользовательской машине)
  • Локальные EJB: доступ может быть только из других «компонентов», работающих на одной JVM, например, Web Front-end, других EJB
  • Просмотр без интерфейса: то же, что и Local, но без указания бизнес-интерфейса
  • Нет annotations: простой POJO, но не EJB

Локальные / Нет-интерфейсные представления более эффективны, чем удаленные EJB, так как ссылки объектов могут быть переданы.

Я думаю, что путаница, которую вы / мы чувствуем, является результатом сопоставимости истории / назад (так сказать). Я не могу отличить любую разницу (за исключением того, что спецификация требует реализаций для создания интерфейса, если мы используем локальный вид)

Вид без интерфейса имеет то же поведение, что и локальное представление EJB 3.0, например, он поддерживает такие функции, как семантика вызова по-ссылке, а также распространение транзакций и безопасности. Тем не менее, представление без интерфейса не требует отдельного интерфейса, то есть все общедоступные методы classа bean автоматически отображаются вызывающему. По умолчанию любой сеансовый компонент, который имеет пустое предложение, и не определяет какие-либо другие локальные или удаленные представления клиента, предоставляет представление без интерфейса.

Блог Oracle перед выпуском EJB 3.1

Если вы заинтересованы в более технических деталях, позвольте мне сказать, что на самом деле происходит … У вас нет прямого доступа к объекту EJB, это означает, что у вас нет ссылки (адреса) фактического объекта EJB. Когда вы просматриваете или вводите свой EJB, контейнер предоставляет объект как клиент для этого EJB (мы можем вызвать прокси или Wrapper), и вы вызываете свои бизнес-методы на этом прокси-объекте. (Вот почему вы не должны использовать новое ключевое слово для создания объекта classа EJB)

Теперь для каждого типа аннотаций контейнер генерирует разные типы прокси с различными методами и функциональными возможностями.

@LocalBean (или без annotations). Прокси-объект имеет:

  • setOptionalLocalIntfProxy()
  • getSerializableObjectFactory()

@Local Вы используете прокси-сервер для локального вызова и типа com.sun.proxy Он имеет:

  • getSerializableObjectFactory()
  • isProxyClass()
  • getProxyClass()
  • getInvocationHandler()
  • newProxyInstance()

@Remote You Wrapper использует удаленный вызов и имеет:

  • readResolve()
  • writeReplace()
  • getStub()
  • getBusinessInterfaceName()
  • Редактирование ArrayList объектов с помощью struts 2 form tag
  • Критерии для гибернации для дат
  • Различия между различными видами управляемых фасолей JSF
  • Правильное использование пула соединений JDBC (Glassfish)
  • Eager / автозагрузка EJB / нагрузки EJB при запуске (на JBoss)
  • Зависимости веб-проектов Eclipse
  • Сервлет против RESTful
  • PowerMockito макет одиночного статического метода и возвращаемого объекта
  • Нет провайдера Persistence для EntityManager с именем X
  • Как я могу проверить, какая версия EL используется сервером
  • Я использую JDBC Connection Pooling?
  • Давайте будем гением компьютера.