Бобы с состоянием и без состояния в Spring

Что означают компоненты stateful и stateless в Spring? Я много гуглил, но не нашел удовлетворительного ответа.

Любая помощь будет оценена по достоинству.


person rahul    schedule 07.03.2015    source источник
comment
научитесь лучше гуглить, не зная предмета и вложив около 10 секунд, я нашел это: stackoverflow.com/questions/4506241/   -  person mmgross    schedule 08.03.2015


Ответы (2)


Состояние чаще всего представлено переменной поля, которая не связана автоматически.

Итак, это bean-компонент с состоянием:

@Component
public class Stateful {
    private int someCounter;

    ...
}

Stateless — это bean-компонент, который не имеет переменных уровня класса или только экземпляры singleton bean-компонентов, автоматически привязанные к типам без сохранения состояния.

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

Итак, мой пример — это небезопасный для потоков антипаттерн, потому что такой определенный bean-компонент является одноэлементным. И singleton bean должен быть без гражданства.

person luboskrnac    schedule 07.03.2015
comment
Спасибо за ваш ответ. Это действительно полезно. Какой шаблон вы бы порекомендовали, если этот способ имеет недостатки? Я рассматривал варианты использования в памяти, полностью кэшированные в памяти приложения. Спасибо! - person ddsultan; 22.06.2020

В основном Spring не позволяет использовать bean-компоненты с состоянием. Если вы используете Singleton - у вас проблемы - следующий вызов "увидит" старые данные. Если вы используете Prototype - каждый вызов любого метода этого bean-компонента приведет к созданию нового экземпляра класса, что опять же не то, что вам нужно.

Кажется, что решение - использовать ключевое слово new всякий раз, когда вам нужны классы с отслеживанием состояния.

Или используйте оставшуюся область запроса или сеанса, однако они доступны только в веб-контейнере.

person ACV    schedule 13.12.2019