EJB 3.1 @LocalBean vs без аннотации
Я понимаю разницу между локальным видом, удаленным видом и видом без интерфейса. Я просто не понимаю, в чем разница между "no view" (без аннотации) и No-interface view. А также почему я должен аннотировать свой интерфейс с @Local? Что делать, если я вообще не аннотирую интерфейс, есть ли разница?
4 ответов:
правила (по памяти):
- у Боба есть
@LocalBeanаннотация - > bean имеет вид без интерфейса- у Боба есть
@Localаннотация - > Боб имеет локальный вид- у Боба есть
@Remoteаннотация - > Боб имеет удаленный вид- Bean не имеет аннотаций представления, но непосредственно реализует интерфейс, который имеет аннотацию @Local - > bean имеет локальный вид
- Bean не имеет аннотаций представления, но непосредственно реализует интерфейс, который имеет @дистанционного аннотации -> Bean поддерживает удаленный просмотр
- Bean не имеет аннотаций представления, но непосредственно реализует интерфейс, который не имеет аннотаций представления - > bean имеет локальный вид
- Бин не имеет никакого представления аннотации и реализует никаких интерфейсов -> бин без интерфейса
Итак, используя
@LocalBeanи использование без аннотации вообще являются обоими способами получения представления без интерфейса. Если вы просто хотите без интерфейса, то самый простой дело не в аннотации. При условии, что вы также не реализуете никаких интерфейсов.часть причины
@LocalBeanсуществует для добавления представления без интерфейса к компоненту, который также имеет представление интерфейса. Я предполагаю, что сценарий, самый главный в умах авторов спецификации, был тем, где у вас есть Боб, например:@Stateless public class UserPreferences { public String getPreference(String preferenceName); public Map<String, String> getPreferences(); }где вы хотели бы выставить оба метода локально, но только укрупненная
getPreferences()удаленно. Вы можете сделать это, объявив удаленный интерфейс только с этим метод, то просто пощечина@LocalBeanв классе bean. Без него вам пришлось бы написать бессмысленный локальный интерфейс, чтобы предоставить оба метода локально.или, если посмотреть на это по-другому, то
@LocalBeanсуществует, потому что существует такая вещь, как представление без интерфейса, и опция без аннотации существует как удобный ярлык.
- удаленный EJBs: можно получить доступ от удаленных клиентов (клиенты, работающие на другой JVM, такие как Swing или JavaFX клиентов, которые работают на компьютере пользователя)
- локальные EJBs: может быть только доступ из других "компонентов", работающих на том же JVM, например веб-интерфейсы, другие EJBs
- no-interface view: то же самое, что и локальный, но без указания бизнес-интерфейса
- нет аннотации: простой POJO, но не EJB
Local / No-interface представления более эффективны, чем удаленные EJBs, так как ссылки на объекты могут передаваться.
Я думаю, что путаница, которую вы / мы чувствуем, является результатом истории / обратной совместимости (так сказать). Я не могу найти никакой разницы (за исключением того, что спецификация. требуется реализация для создания интерфейса, если мы используем local-view)
представление без интерфейса имеет то же поведение, что и локальное представление EJB 3.0, например, он поддерживает такие функции, как вызов pass-by-reference семантика и распространение транзакций и безопасности. Однако без интерфейса не требует отдельного интерфейса, то есть все открытые методы класса bean автоматически подвергаются воздействию абонент. По умолчанию любой сеансовый компонент, который имеет пустые реализации предложение и не определяет никаких других локальных или удаленных клиентских представлений, предоставляет представление клиента без интерфейса.
если вас интересуют более технические детали, позвольте мне сказать, что на самом деле происходит.... У вас нет прямого доступа к объекту EJB, это означает, что у вас нет ссылки (адреса) фактического объекта EJB. Когда вы ищете или вводите свой EJB, контейнер предоставляет объект в качестве клиента для этого EJB (мы можем вызвать прокси или оболочку), и вы вызываете свои бизнес-методы на этом прокси-объекте. (Вот почему вы не должны использовать ключевое слово new для создания объекта EJB с класс)
теперь для каждого типа аннотации, контейнер создает различные типы прокси с различными методами и функциями.
@LocalBean(или без аннотации) Ваш прокси-объект имеет:
setOptionalLocalIntfProxy()getSerializableObjectFactory()
@LocalВы прокси-объект использовать локальный вызов и типcom.sun.proxyтак это имеет:
getSerializableObjectFactory()isProxyClass()getProxyClass()getInvocationHandler()newProxyInstance()
@RemoteВы объект оболочки использовать удаленный вызов и он имеет:
readResolve()writeReplace()getStub()getBusinessInterfaceName()
Comments