2010-01-01 2 views
2

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

Каковы последствия того, что один экземпляр, выданный контейнером, каждый раз? означает ли это, что будет общее состояние?

i.e, если экземпляр где-то изменен, все будущие создания объектов фактически получат «грязный» объект, а не «новый»?

ответ

2

Поскольку вы обычно программируете интерфейс с Spring, объекты, управляемые DI, не могут беспокоиться о состоянии. В этом случае нет никакой озабоченности по поводу «грязной». Хранилища, службы, контроллеры - все должно иметь мало или вообще не говорить о состоянии.

+0

, так что вы говорите, что классы POJO действительно не беспокоятся о состоянии, они только что прошли? Но не создавайте ли вы объект User, а затем задавайте его свойства, а затем сохраняйте его. если его singleton (по умолчанию), не будет устанавливать значение имени пользователя во всех остальных экземплярах в будущем? – mrblah

+0

Нет, если вы создаете объект User и сохраняете его, вы вызываете new для его создания и сохранения, чтобы поместить его в базу данных как часть транзакции. Ссылка пользователя может быть или не быть GC'd, когда она выходит за рамки. Это не под контролем Весны. Вы не настраиваете то, как вы выполняете службу или DAO. – duffymo

+0

ah ok, через 24 часа чтение того, что вы написали, имеет смысл. вы не устанавливаете POJO с DI .... – mrblah

0

Объект singleton - это просто. Каждый объект, который имеет инъекцию singleton, получает ссылку на объект того же объекта. Любые изменения в этом объекте будут видны (по поведению или иным образом) всем потребителям этого объекта.

1

Если вы объявляете область управления, управляемую Spring, как одноэлементный, да, будет общее состояние. Как правило, вы не используете несоответствующие переменные экземпляра так же, как вы могли бы избежать этого при создании сервлета. Но состояние контроллера будет включать в себя вызываемую им службу, состояние службы будет включать ссылки на объекты доступа к данным, которые он использует.

0

Определенно вам следует избегать сохранения состояния в одноэлементном сеансе, если вы не используете какую-то синхронизацию. В идеале, синглтоны не должны иметь полей экземпляров. Используйте фасоль с сохранением состояния, когда вам нужно поддерживать состояние в разговорной форме. Когда вы закончите с компонентом stateful, вы должны явно удалить его, иначе у вас будет утечка памяти на ваших руках.

Смежные вопросы