Я хочу определить "одиночка без гражданства" в 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 {
..
}
Кстати, я не вижу преимущества в объединении «экземпляров без сохранения состояния» вместо одного «одноэлементного компонента без сохранения состояния».
'@ApplicationScoped' управляется контейнером сервлетов, а @javax.ejb.Singleton управляется EJB-Container. Имеет ли значение, если клиент не имеет веб-сеанса и использует только MyStatelessSingleton внутри ejb-контейнера?
Используйте тот, который подходит вам.
Под апатридом вы имеете в виду, что ваш экземпляр Bean-Instance не имеет полей? В противном случае экземпляры без сохранения состояния в пуле (@Stateless) могут помочь вам по сравнению с синглтонами без управления параллелизмом.
@aschoerk да, экземпляр bean-компонента не имеет полей, только вызовы методов. Пожалуйста, не могли бы вы привести пример, где экземпляры без состояния (@Stateless) с полем экземпляра могут помочь в сравнении с синглтонами без состояния? Я предполагаю, что поля экземпляров внутри bean-компонентов без сохранения состояния всегда равны для всех клиентов, так же, как и синглтоны без сохранения состояния.
Если вы используете bean-компонент без сохранения состояния с полями. Во время одного вызова компонента вы можете безопасно использовать поля экземпляра, поскольку во время этого вызова экземпляр принадлежит вашему потоку. Это может помочь избежать длинных списков параметров, если экземпляр bean-компонента использует вызовы других методов в том же bean-компоненте. Возможно, это не очень красивое решение, но такое случается. В случае Singleton с деактивированным ConcurrencyManagement эти поля могут быть обработаны другими потоками. Но вы можете использовать поля и в таких синглтонах, если вы определите их ThreadLocal или обработаете их с помощью Atomic....
@aschoerk хорошая мысль: «Это может помочь избежать длинных списков параметров, если экземпляр bean-компонента использует вызовы других методов в том же bean-компоненте». Однако, когда другой клиент использует этот bean-компонент без сохранения состояния после его помещения в пул, клиент унаследует все эти переменные экземпляра, установленные предыдущим клиентом. Или?
Я так полагаю. Тем более он не может предполагать для них значения по умолчанию.




Я не думаю, что это имеет значение. Это синглтон. Его природа без сохранения состояния/с сохранением состояния будет зависеть только от того, как вы его реализуете. ApplicationScoped мой фаворит здесь.
да, я также предпочитаю @ApplicationScoped. Я не могу найти никакой выгоды в использовании «версии 1».
Кстати, я хочу использовать шаблон "синглтон без состояния" для DAO без состояния (типичный JPA-CRUD, где entityManager предоставляется в параметрах метода). Итак, я думаю, синглтон без гражданства лучше, чем использование «@Stateless».
Но если bean-компонент не имеет состояния / с полным состоянием, это имеет значение только в том случае, если вы используете неодноэлементные bean-компоненты, поскольку контейнер может манипулировать экземплярами во время одного процесса, поскольку не имеет значения, является ли это одним и тем же экземпляром этого bean-компонента. Синглтон всегда один и тот же. Более того, bean-компоненты с сохранением состояния имеют свой жизненный цикл. Вряд ли можно сказать, что в синглтоне есть жизненный цикл.
Я решил использовать «Singleton» вместо «Stateless» только для экономии памяти: потому что я не хочу вводить новые экземпляры (без сохранения состояния) или из группы объединенных экземпляров при каждой инъекции. Мне не нужны bean-компоненты с состоянием, и мне не нужны экземпляры в пуле. Я не вижу преимущества в объединении «экземпляров без гражданства» вместо одного «одноэлементного компонента без гражданства».
я не думаю, что это имеет значение