Ваш бин является одноэлементным и должен быть без состояния (по крайней мере, неизменяемым или эффективно без состояния) для обеспечения безопасности потока и правильности.
Как правило, вы должны использовать область действия прототипа для всехbean-компоненты с состоянием и единичная область действия для bean-компонентов без состояния.
Spring-документация
Иногда создание bean-компонента довольно дорого,поэтому более разумно создать экземпляр один раз, а затем гарантировать, что все возможные изменения, внесенные в этот объект, будут пронизаны безопасным и корректным образом для всех его потребителей.
Я советую создать простой механизм, управляемый событиями.
Существует
- a
MessageListenerContainerEvent extends ApplicationEvent
, который представляет изменения, внесенные в bean-компонент MessageListenerContainer
; - a
MessageListenerContainerChanger implements ApplicationListener<MessageListenerContainerEvent>
, который является одним слушателем, который изменяетсостояние бина и гарантирует, что все работает должным образом; - другие слушатели, которые являются классом, которые используют бин и заинтересованы в его обновлении.Не обязательно отправлять изменения потребителям бобов, вы можете просто уведомить их без сообщения.Для них это означает, что некоторые свойства компонента, который они используют локально, могут быть устаревшими.
- издатель, который может быть конечной точкой HTTP, или
@ShellMethod
.
Это может показаться слишком сложным, вы всегда можете упростить его до
// somewhere in your code
synchronized(bean) {
bean.setConcurrentConsumers(10);
}
, но имейте в виду правильность этого фрагмента.