2012-06-04 4 views
59

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

+0

Какой EJB боба он станет, если не аннотировать все это? Или, говоря иначе, как бы контейнер знал, был ли класс POJO или SessionBean? – esej

+2

@esej Вы комментируете его аннотацией без учета состояния, состояния или Singleton, а затем вы либо аннотируете его с помощью аннотации Local, Remote или LocalBean, либо вы не комментируете его с помощью такого аннотаций. Таким образом, контейнер знает, является ли класс SessionBean, когда вы комментируете его с помощью аннотации Stateless, Stateful или Singleton. – VaclavDedik

+0

Исправить. (Раньше я не понимал, что вы считаете разницей, теперь я стал более мудрым (потому что у меня была странная идея).) – esej

ответ

114

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

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

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

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

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

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

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

+8

Точные правила приведены в разделе 4.9.7 спецификации EJB 3.1. Они немного сложнее, чем то, что вы представляете (дома, веб-сервисы, исключение интерфейса java.io/javax.ejb), но это приятное резюме. –

+0

@bkail: Спасибо за ссылку. У меня нет копии спецификации, и сайт Oracle остановился, когда я попытался загрузить его, поэтому я не мог проверить. Я понял, что это область, которую мне нужно читать, хотя! –

+0

Как я понимаю. Является POJO LocalBean? – bitli

14
  • Дистанционные EJBs: можно получить от удаленных клиентов (клиентов, работающих на другой виртуальной машины Java, такие как свинг или JavaFX клиентов, которые работают на компьютере пользователя)
  • Местные EJBs: может быть доступ из других «компонентов» только работает на одной JVM, например Web Front-концы, другой EJBs вида
  • Нет-интерфейса: так же, как местные, но без не задав деловой интерфейс
  • Нет аннотации: простой POJO, но не EJB

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

+2

Я думал, что POJO становится EJB, когда вы аннотируете его аннотацией без учета состояния, Statefull или Singleton. Я что-то упускаю? – VaclavDedik

6

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

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

Oracle Blog before release of EJB 3.1

0

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

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

@LocalBean (или нет аннотаций) Ваш прокси-объект имеет:

  • setOptionalLocalIntfProxy()
  • getSerializableObjectFactory()

@Local Вы прокси-объект с помощью локального вызова и тип com.sun.proxy Так оно:

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

@Remote Вы Упаковочный объект использовать удаленный вызов и имеет:

  • readResolve()
  • writeReplace()
  • getStub()
  • getBusinessInterfaceName()
Смежные вопросы