Как я вижу, ваша путаница связана с областью Singleton
Spring и с тем, как Spring обрабатывает множественные запросы, когда Singleton
классы *1003*.
Spring создают и связывают beans
как Singleton
объектов, если вы не определите конкретную область видимости, используя аннотацию @Scope
или аннотацию, соответствующую области действия, например @SessionScope
. Возможно, вы уже знаете об этом.
Если у вас есть размышления о Singleton
объектах в нескольких потоках, этот ответ дает отличное объяснение. Итак, о ваших вопросах;
- Является ли это даже правильным способом создания стека RESTful? В частности, классы Utility, которые нам нужны, должны ли они быть выполнены как
@Service
или как POJO
классы, используемые в слое Data Management @Service
?
Да и нет. Это правильный путь, если ваш @Service
класс singleton
(должен быть) и неизменный (без учета состояния). Это означает, что ваш класс @Service
не должен иметь никаких изменяемых полей. В противном случае ваш @Service
приведет к непредсказуемым результатам.
Если в этом контексте используется POJO
, то создание экземпляра объекта будет инициализировать новый объект каждый раз, когда запускается новый поток, что приводит нас к вашему второй вопрос;
- В ситуации с несколькими запросами, когда 10-100 запросов одновременно попадают в конечную точку RESTful, что происходит с утилитой пользовательской сортировки
@Service
и методом sort()
? Обслуживает ли метод sort()
каждый запрос последовательно? или параллельно в разных потоках?
Когда 10-100 или тысячи или запросы попадают в конечную точку, если вы использовали POJO, он также создает тысячи дополнительных объектов, которые загрязняют кучу излишне, поскольку мы можем использовать один singleton
объект, используя аннотацию @Service
. Поскольку объект singleton
равен immutable
(который не будет сохранять никаких изменений при вызове методов) и совместно используется несколькими потоками, он может выполняться одновременно без каких-либо побочных эффектов на результат.
Если sort()
происходит в памяти и впоследствии возвращает отсортированные результаты, он выполняется независимо, завернутый в выполнение потока.
- Каждый запрос использует один и тот же метод сортировки, т. Е. Утилита пользовательской сортировки
@Service
является "singleton" , так как же используется метод sort()
?
Singleton
не означает, что его функции не могут быть разделены, если они специально не являются synchronized
. В вашем случае, я считаю, что этот sort()
метод не synchronized
. Таким образом, нет проблем с выполнением метода sort()
для каждого потока отдельно (нет расхождений, поскольку наш объект singleton
не имеет состояния / неизменен).
- Если метод
sort()
действительно одиночен, может ли 1 пользователь в конечном итоге отсортировать List
другого пользователя, если оба пользователя одновременно нажмут на метод? Или Spring Boot просто обрабатывает входящие запросы последовательно или в своих собственных потоках и избегает какого-либо смешивания.
Вы знаете, что загрузка Spring основана на Java EE. Таким образом, в основном он использует экземпляры класса javax.servlet.ServletContext
для обработки этого потока request
и response
, и целый ряд других классов из Java EE вовлечены в этот процесс, который мы не можем увидеть из-за умного замысла Spring. Но поток тот же. Короче говоря, каждый request
имеет отдельные thread
, связанные с ним, и эти request-threads
никогда не перепутываются. Это thread
включает весь процесс, пока ответ не будет отправлен клиенту.
Вы когда-нибудь замечали, что мы не создаем поток вручную, за исключением специального сценария ios? Это потому, что Java EE-экосистемы управляют этими потоками от нашего имени.
Итак, ответ на ваш вопрос: нет, sort()
не будет выполнен один раз, и никогда результаты одного запроса не окажутся в ответе другого запроса. объект, независимо от того, сколько тысяч пользователей делают запрос одновременно. Этот ответ также дает блестящее объяснение того, как работает механизм запроса-ответа.