Одностраничный параллелизм приложений SpringBoot - PullRequest
0 голосов
/ 18 мая 2018

Я скопировал образец Spring Boot SPA.Я хочу понять, что произойдет, если несколько человек используют веб-страницу через URL.Создает ли Java экземпляр веб-приложения за вызов?Ресурсы памяти не разделяются, верно, т. Е. Если к списку добавлен объект списка, каждый пользователь видит свой список?

Ответы [ 3 ]

0 голосов
/ 18 мая 2018

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

https://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch04s04.html

4.4.1 Singleton scope

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

Другими словами, когда вы определяете определение bean-компонента, и оно определено как одноэлементный, контейнер Spring IoC создаст ровно один экземпляр объекта, определенного этим определением bean-компонента.Этот единственный экземпляр будет храниться в кеше таких одноэлементных bean-компонентов, и все последующие запросы и ссылки для этого именованного bean-компонента приведут к возврату кэшированного объекта.

Теперь, если вы используете bean-компонент, этоС учетом состояния и если для каждого запроса используется новый компонент, вы можете определить scope этого компонента: prototype:

4.4.2 Область действия прототипа

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

0 голосов
/ 18 мая 2018

Это не общий доступ - ничего подобного PHP или Rails.Java запускается так медленно, что запуск нового экземпляра приложения для каждого запроса не вариант.

Проверьте пример исходного кода приложения для весенней загрузки, в классе SpringbootJQueryAjaxClientApplication есть метод main,как это:

public static void main(String[] args) {
    SpringApplication.run(SpringBootJQueryAjaxClientApplication.class, args);
}

это основной метод, как и для любой Java-программы, здесь происходит то, что он запускает контейнер с сервлетом и размещает в нем приложение, а затем ожидает http-запросы.

Это один процесс, где каждый запрос обслуживается потоком, поэтому память является общей для .Компоненты Spring, такие как com.javasampleapproach.jqueryajax.controller.RestWebController (по умолчанию имеют одинаковую область видимости), создаются один раз в веб-приложении, и каждый запрос вызывает методы в одном и том же экземпляре.

0 голосов
/ 18 мая 2018

Ресурсы Spring, такие как @Service и @Repository и @RestController, являются одиночными без сохранения состояния.Для обслуживания приложения создается только один экземпляр.

Ваша реализация списка на уровне области будет определять, является ли он общедоступным.Если вы определяете список в контроллере, как в вашем примере, тогда каждый пользователь будет иметь доступ к тому же списку .Вы можете использовать несколько браузеров, чтобы увидеть, что список является общим.Исходя из примера, это нормально, так как получение «всего» должно означать получение всего.

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

...