Вы можете использовать @WebService и @Stateless или @WebService и @Singleton в одном и том же bean-компоненте, что вполне логично, если вы хотите представить POJO как веб-сервис и EJB.
Не вижу большого смысла в использовании @Stateless и @Singleton в одном и том же компоненте. Когда вы используете @Singleton, вы создаете EJB со всеми возможностями EJB (управление транзакциями, безопасность и т. Д.) Точно так же, как с @Stateless. Разница лишь в том, как контейнер управляет жизненным циклом EJB:
- @ Stateless : экземпляр EJB создается сразу после первого запроса, а когда запрос заканчивается, EJB объединяется и готов к повторному использованию, если поступает другой запрос. Однако, если все объединенные экземпляры Используемый в тот момент, когда поступает другой запрос для того же компонента, контейнер создает новый экземпляр того же объекта для обслуживания этого нового запроса.
- @ Singleton : экземпляр EJB создается после поступления первого запроса (по умолчанию см. @Startup, чтобы переопределить это поведение), и это будет единственный экземпляр, созданный контейнером. Если другой запрос хочет использовать тот же EJB, контейнер никогда не создаст его новый экземпляр - будет использован ранее созданный экземпляр. Это похоже на @Stateless EJB с размером пула 1 :) Аспекты, такие как параллелизм, важны при их использовании, но это, вероятно, выходит за рамки этого поста.