2014-02-04 4 views
4

Почему Spring не поддерживает реализацию области потока? Кто-нибудь использовал потоковые бобы с Spring в контексте веб-приложения? Должно быть стандартное, четкое описание того, как это сделать! (SpringByExample имеет решение — я не проверял — но это не мейнстрим еще.)Почему весна не обеспечивает реализацию области потока?

ответ

8

Spring действительно обеспечивает объем резьбы, но он не зарегистрирован по умолчанию.

Существующие области бобов определены в документации, here.

одноэлементного

  • (по умолчанию) Область применения единого определения боба для одного экземпляра объекта в Spring IoC контейнера.

прототип

  • Области применения единого определения боб для любого числа объектов экземпляров.

запрос

  • Области применения единого определения боб с жизненным циклом одного запроса как HTTP-; то есть каждый HTTP-запрос имеет свой собственный экземпляр компонента, созданного с обратной стороны одного определения компонента. Действует только в контексте веб-значащей пружины ApplicationContext.

сессия

  • Области применения единого определения боб в жизненном цикле HTTP сессии. Действует только в контексте веб-контекста Spring ApplicationContext. глобального

применения

  • Область применение единого определения боба для жизненного цикла ServletContext. Действует только в контексте значащей сети весны ApplicationContext.

WebSocket

  • Области применения единого определения боб для жизненного цикла WebSocket. Только действителен в контексте значащей в сети весны ApplicationContext.

Документация затем делает отметку

С весной 3.0, область применения потока доступна, но не зарегистрирована по умолчанию. Для получения дополнительной информации см. Документацию для SimpleThreadScope.

Обратите внимание, что, как и в рамках прототипа, объем потока

[SimpleThreadScope] не чистит любые объекты, связанные с ним.

В этой реализации области применения используется ThreadLocal для хранения бобы. Вы не можете обнаружить Thread, заканчивающийся/умирающий в Java, поэтому контейнер Spring IOC не может явно знать, когда нужно удалить компоненты из ThreadLocal и вызвать любые методы жизненного цикла. Тогда эта ответственность приходится на разработчика.

Будьте осторожны, когда вы используете этот объем. Например, в контексте объединения потоков, возможно, уже был создан и хранится компонент в одном из повторных потоков пулов. В зависимости от вашего варианта использования это может быть неправильное поведение.

+2

Я не совсем понял ваш ответ, не могли бы вы объяснить это дальше? Вы говорите, что мы не можем определить конец потока, но почему это проблема? Если контейнер IOC создает экземпляр и помещает его в хранилище ThreadLocal этого потока, он может передать его потоку и всякий раз, когда этот поток замирает, объекты на локальном хранилище потоков будут собирать мусор, не так ли ? Тогда почему контейнер DI должен заботиться о жизненном цикле потока, он может просто ввести объект и передать его. Что мне здесь не хватает? –

+0

@SotiriosDelimanolis «Серьезная» проблема, которую вы видите с областью потока, существует также с областью Prototype, так же, как контейнер Spring не знает, когда bean bean-объект Thread должен быть уничтожен, он не знает то же самое о компонентах scope Prototype также. –

+0

@SotiriosDelimanolis Со ссылкой на мой комментарий выше, пожалуйста, обратитесь к документам Spring по адресу https://docs.spring.io/spring/docs/4.3.14.RELEASE/spring-framework-reference/htmlsingle/#beans-factory-scopes- прототип, который гласит: «В отличие от других областей, Spring не справляется с полным жизненным циклом прототипа: контейнер создает, настраивает и иным образом собирает объект-прототип и передает его клиенту, без дальнейшей записи этого экземпляра прототипа ..... Все управление жизненным циклом за эту точку должно обрабатываться клиентом ». –

2

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

Считают, что потоки могут быть объединены на серверах, и это, вероятно, причина, почему это не сфера нить на Спринг

Посмотрите на область запроса: http://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch04s04.html

+1

Ваш ответ на другой вопрос :(. В области запроса бобы не autowire для асинхронной обработки на стороне сервера. Если есть необходимость иметь пакетное задание или любую другую обработку фона, вы не можете использовать ваши весенние бобы, потому что не удастся при аутсорсинге бобы с запросом. –

+0

Вы спросили об использовании компонентов с потоковыми областями в контексте веб-приложения, и именно это я ответил. – Andres

+0

Ну, область потока не совсем такая же, как область запроса. «примерно то же самое». Может быть, я не был достаточно ясен в вопросе. Спасибо за ответ в любом случае! –

6

На самом деле он обеспечивает область потока, начиная с Spring 3.0. Возможно, вам придется зарегистрировать его самостоятельно, а не использовать его из коробки.

См https://jira.springsource.org/browse/SPR-2581

+0

Если вы говорите о org.springframework.context.support.SimpleThreadScope, это не делает никакой очистки, и это непригодно. Это, в основном, пул потоков пула ..., который является werid! :) SpringByExample имеет реализацию, которая может работать, но я еще не пробовал ее. –

+0

Я не сказал, что это хороший, но есть один. –

+0

:) да, спасибо за ответ. –

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