EJB tutorials показывает, что EJB может быть как Singleton, так и Stateful или или без гражданства. Я никогда не пытался использовать более одного из этих аннотаций, но я вполне уверен, что правильное решение - использовать только один из них.
С этой ссылке:
Singleton сессионные компоненты сохраняют свое состояние между клиентом вызовы
Таким образом, на ваш вопрос:
если я определяю EJB с @Singleton аннотация будет ли она по умолчанию по умолчанию, или я должен определить ее с помощью @Stateful?
Если для Stateful вы имеете в виду способность поддерживать свое состояние, то ответ: да, по умолчанию Singleton будет Stateful.
Имейте в виду, что существуют определенные ситуации, в которых Singleton не ведет себя как Singleton, прочтите это article об этом. Как правило, вы не запускаете такой риск, если находитесь за пределами кластера и не используете конструктор по умолчанию: вам нужно всегда использовать ссылки EJB, введя его в другом EJB или веб-клиенте, используя:
@EJB MyEJB myEJB;
Наконец, посмотрите на часть учебника Java EE 6, посвященную жизненному циклу EJB, пояснив, что основным отличием между Stateful и другими EJB является способность пассивироваться контейнером в течение его жизни. Это различие является основной причиной того, что утверждение «Синглтон по умолчанию по умолчанию» неверно, но верно в контексте вашего вопроса.
Спасибо за хорошие рекомендации. Я немного волнуюсь, потому что он говорит в учебнике Java EE 6: «В конце жизненного цикла контейнер EJB вызывает метод аннотированный @PreDestroy, если он существует. Синтаксический сеансовый компонент теперь готов к сбору мусора. " Это произойдет только тогда, когда я закрою свой сервер приложений или это произойдет иначе? – Marthin
Мой опыт в том, что это произойдет только тогда, когда приложение будет отключено или отключено или сервер будет отключен. – perissf