Для чего используется прототип Spring Bean?

по умолчанию Bean, созданного Весна синглтон. Они потокобезопасны, потому что не имеют состояния. Когда мы хотим, чтобы Spring создала компонент с состоянием, нам нужно использовать область прототипа для определения компонента. Мы должны позаботиться о потокобезопасных вопросах для них. Все безгосударственные бобы будут загрязнены, когда они будут введены прототипом Боба. Итак, я просто не могу представить, где мы можем использовать область прототипа. Можете ли вы дать какой-то типичный сценарий, который мы можем / должны использовать prototype Spring Бин? Кроме того, как мы можем аннулировать состояние загрязнения на других одноэлементных бобах?

2 ответов


есть много причин использовать область прототипа, например, в любое время, когда вы используете "новый" вместо использования синглтона. Боб для каждого пользователя, боб для каждого запроса, коллекция уникальных бобов и т. д. В конце концов, в любом нетривиальном приложении вы не используете не-синглеты намного больше, чем синглеты?

одноэлементные бобы не являются потокобезопасными просто потому, что они синглтоны–они должны быть написано быть потокобезопасным. Они не становятся потокобезопасными магически. Область Бина просто это, его область: он не делает bean соответствующего для конкретной области–это разработчик.


Я воспринимаю прототипные бобы как альтернативу заводским классам, используемым для создания объектов. Разница в том, что в случае прототипа beans spring сэкономит вам код для инъекции зависимостей, а также автоматически прокси-объекты для транзакций и т. д. когда это уместно.

Я сам предпочитаю заводской подход. Одним из разумных сценариев для области прототипа, с которым я столкнулся, был объект с состоянием, необходимый различным известным бобам, и каждый требовал свою собственную копию. Ля выделенный заводской класс был бы избыточным в этом сценарии, так как мне не нужно было создавать объекты на лету, а только во время создания экземпляра других бобов.