Вопрос по java – EJB 3.1 @LocalBean против аннотации

72

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

Каким компонентом EJB-компонента он станет, если вы не аннотируете все это? Или, иначе говоря, как контейнер узнает, является ли класс POJO или SessionBean? esej
Правильный. (Раньше я не понимал, в чем, как вы думаете, будет разница, теперь я стал мудрее (потому что у меня была странная идея).) esej
Я думаю, что отсутствие аннотации подразумевает отсутствие интерфейса. Таким образом, нет никакой разницы между "отсутствием просмотра". и вид без интерфейса! Tom Anderson
@esej Вы аннотируете это с помощью аннотации без сохранения состояния, с сохранением состояния или синглтоном, а затем либо аннотируете ее с помощью локальной, удаленной или локальной аннотации, либо вы не аннотируете это с помощью аннотации такого рода. Таким образом, контейнер узнает, является ли класс SessionBean, когда вы аннотируете его аннотацией без сохранения состояния, с состоянием или синглтоном. VaclavDedik

Ваш Ответ

4   ответа
6

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

The no-interface view has the same behavior as the EJB 3.0 local view, for example, it supports features such as pass-by-reference calling semantics and transaction and security propagation. However, a no-interface view does not require a separate interface, that is, all public methods of the bean class are automatically exposed to the caller. By default, any session bean that has an empty implements clause and does not define any other local or remote client views, exposes a no-interface client view.

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

0

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

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

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

  • setOptionalLocalIntfProxy()
  • getSerializableObjectFactory()

@Local Вы прокси объект используете локальный вызов и типcom.sun.proxy Итак, оно имеет:

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

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

  • readResolve()
  • writeReplace()
  • getStub()
  • getBusinessInterfaceName()
131

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

  1. Bean has a @LocalBean annotation -> bean has a no-interface view
  2. Bean has a @Local annotation -> bean has a local view
  3. Bean has a @Remote annotation -> bean has a remote view
  4. Bean has no view annotations, but directly implements an interface which has a @Local annotation -> bean has a local view
  5. Bean has no view annotations, but directly implements an interface which has a @Remote annotation -> bean has a remote view
  6. Bean has no view annotations, but directly implements an interface which has no view annotations -> bean has a local view
  7. Bean has no view annotations, and implements no interfaces -> bean has a no-interface view

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

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

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

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

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

@bkail: Спасибо за ссылку. У меня нет удобной копии спецификации, и сайт Oracle остановился, когда я попытался ее скачать, поэтому я не смог проверить. Я понял, что это та область, о которой мне нужно читать, хотя!
@bitli: Если POJO не реализует какие-либо интерфейсы и не имеет аннотаций, то он имеет представление без интерфейса, как если бы он был аннотирован@LocalBean.
Насколько я понимаю. POJO является LocalBean?
Точные правила приведены в разделе 4.9.7 спецификации EJB 3.1. Они немного сложнее, чем то, что вы представляете (дома, веб-сервисы, исключения интерфейса java.io/javax.ejb), но это хорошее резюме.
15
  • Remote EJBs: can be accessed from remote clients (clients running on a different JVM such as Swing or JavaFX clients which run on the user machine)
  • Local EJBs: can only be access from other "components" running on the same JVM, e.g. Web Front-ends, other EJBs
  • No-interface view: same as Local but without specifing the business interface
  • No annotation: a simple POJO but not an EJB

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

Я думал, что POJO становится EJB, когда вы аннотируете его без аннотации без состояния, Statefull или Singleton. Я что-то пропустил? VaclavDedik
@Puce, Вы сказали "Нет аннотации: простой POJO, но не EJB", что противоречит комментарию Тома Андерсона. Если POJO не реализует никаких интерфейсов и не имеет аннотаций, то у него нет представления без интерфейса так же, как если бы это было аннотировано @ LocalBean & quot ;. Вы можете уточнить?

Похожие вопросы