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