Синглтон без гражданства в Java EE

Я хочу определить "одиночка без гражданства" в JAVA-EE, к которому могут одновременно обращаться несколько потоков.

Под апатридом я подразумеваю: Bean-Instance не имеет полей.

Какой из них я должен использовать:

версия 1:

@javax.ejb.Singleton
@ConcurrencyManagement(ConcurrencyManagementType.BEAN)
public class MyStatelessSingleton {
..
}

версия 2:

@ApplicationScoped
public class MyStatelessSingleton {
..
}

версия 3:

@javax.inject.Singleton
public class MyStatelessSingleton {
..
}

Кстати, я не вижу преимущества в объединении «экземпляров без сохранения состояния» вместо одного «одноэлементного компонента без сохранения состояния».

я не думаю, что это имеет значение

Antoniossss 28.07.2019 22:54

'@ApplicationScoped' управляется контейнером сервлетов, а @javax.ejb.Singleton управляется EJB-Container. Имеет ли значение, если клиент не имеет веб-сеанса и использует только MyStatelessSingleton внутри ejb-контейнера?

nimo23 28.07.2019 23:06

Используйте тот, который подходит вам.

Antoniossss 28.07.2019 23:08

Под апатридом вы имеете в виду, что ваш экземпляр Bean-Instance не имеет полей? В противном случае экземпляры без сохранения состояния в пуле (@Stateless) могут помочь вам по сравнению с синглтонами без управления параллелизмом.

aschoerk 29.07.2019 15:01

@aschoerk да, экземпляр bean-компонента не имеет полей, только вызовы методов. Пожалуйста, не могли бы вы привести пример, где экземпляры без состояния (@Stateless) с полем экземпляра могут помочь в сравнении с синглтонами без состояния? Я предполагаю, что поля экземпляров внутри bean-компонентов без сохранения состояния всегда равны для всех клиентов, так же, как и синглтоны без сохранения состояния.

nimo23 29.07.2019 16:20

Если вы используете bean-компонент без сохранения состояния с полями. Во время одного вызова компонента вы можете безопасно использовать поля экземпляра, поскольку во время этого вызова экземпляр принадлежит вашему потоку. Это может помочь избежать длинных списков параметров, если экземпляр bean-компонента использует вызовы других методов в том же bean-компоненте. Возможно, это не очень красивое решение, но такое случается. В случае Singleton с деактивированным ConcurrencyManagement эти поля могут быть обработаны другими потоками. Но вы можете использовать поля и в таких синглтонах, если вы определите их ThreadLocal или обработаете их с помощью Atomic....

aschoerk 29.07.2019 17:43

@aschoerk хорошая мысль: «Это может помочь избежать длинных списков параметров, если экземпляр bean-компонента использует вызовы других методов в том же bean-компоненте». Однако, когда другой клиент использует этот bean-компонент без сохранения состояния после его помещения в пул, клиент унаследует все эти переменные экземпляра, установленные предыдущим клиентом. Или?

nimo23 29.07.2019 18:09

Я так полагаю. Тем более он не может предполагать для них значения по умолчанию.

aschoerk 29.07.2019 18:22
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
8
135
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не думаю, что это имеет значение. Это синглтон. Его природа без сохранения состояния/с сохранением состояния будет зависеть только от того, как вы его реализуете. ApplicationScoped мой фаворит здесь.

да, я также предпочитаю @ApplicationScoped. Я не могу найти никакой выгоды в использовании «версии 1».

nimo23 28.07.2019 22:58

Кстати, я хочу использовать шаблон "синглтон без состояния" для DAO без состояния (типичный JPA-CRUD, где entityManager предоставляется в параметрах метода). Итак, я думаю, синглтон без гражданства лучше, чем использование «@Stateless».

nimo23 28.07.2019 23:02

Но если bean-компонент не имеет состояния / с полным состоянием, это имеет значение только в том случае, если вы используете неодноэлементные bean-компоненты, поскольку контейнер может манипулировать экземплярами во время одного процесса, поскольку не имеет значения, является ли это одним и тем же экземпляром этого bean-компонента. Синглтон всегда один и тот же. Более того, bean-компоненты с сохранением состояния имеют свой жизненный цикл. Вряд ли можно сказать, что в синглтоне есть жизненный цикл.

Antoniossss 28.07.2019 23:09

Я решил использовать «Singleton» вместо «Stateless» только для экономии памяти: потому что я не хочу вводить новые экземпляры (без сохранения состояния) или из группы объединенных экземпляров при каждой инъекции. Мне не нужны bean-компоненты с состоянием, и мне не нужны экземпляры в пуле. Я не вижу преимущества в объединении «экземпляров без гражданства» вместо одного «одноэлементного компонента без гражданства».

nimo23 28.07.2019 23:15

Другие вопросы по теме