Когда использовать пробел прототипа Spring?

Я хочу знать, когда я должен использовать область prototype в Spring? Я понял, что singleton возвращает тот же экземпляр объекта, если запрашивается bean.

Тогда почему мы должны рассматривать prototype?

Объяснения с примерами помогут многим понять необходимость в нем.

Ответ 1

Чтобы быть ясными простыми определениями:

  • Область прототипа = новый объект создается каждый раз, когда он вводится/просматривается. Он будет использовать новый SomeBean() каждый раз.

  • Singleton scope = Тот же объект возвращается каждый раз, когда он вводится/просматривается. Здесь он будет создавать экземпляр одного экземпляра SomeBean, а затем возвращать его каждый раз.

Прототип bean создается во время использования. Поэтому, когда вы хотите иметь statefull beans, иногда требуется сильная потребность в области прототипов или когда вы не хотите кэшировать любые значения в beans. Прототип bean может быть связан с одним сеансом или некоторым вызовом.

Пример:

Объект доступа к данным (DAO) обычно не сконфигурирован как прототип, поскольку типичный DAO не имеет никакого диалогового состояния; для этого автора было просто проще повторно использовать ядро ​​одноэлементной диаграммы.

Ответ 2

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

Представьте, что вы должны построить систему слежения за транспортными средствами в режиме реального времени, и у вас будет 2 000 000 автомобилей, которые будут обмениваться информацией каждые 5 секунд, На стороне сервера вы будете работать с двумя или более различными группами конфигураций: одна для автомобилей, а другая для грузовиков.

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

Таким образом, в этом случае, всякий раз, когда сервер получает новое сообщение от Truck, например, сервер получит экземпляр конфигурации в памяти из хэш-карты экземпляров VehicleGrupConfiguration, а затем применит поведение конфигурации что это сообщение должно иметь, например: например, время ожидания, повтор... и т.д.

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

Ответ 3

Как сказано в документации, создание bean-компонента Foo с областью действия прототипа аналогично вызову:

Foo foo = new Foo(dependency1, dependency2, ...);
foo.initialize(dependency7, dependency8...);

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

Например, если вы хотите написать постоянный код, похожий на EJB2 Java Entity Bean, например,

Person p = ...
p.setName("John Doe");
p.save(); // write to DB

Вместо использования способа JPA

Person p = new Person();
p.setName("John Doe");
personService.save(p); // write to DB

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

Другой пример: Если вы хотите использовать не-потокобезопасный Java-класс SimpleDateFormat во многих местах вашего приложения, с шаблоном формата из файла конфигурации (возможно, с использованием различных форматов в зависимости от других условий). Вместо того, чтобы создавать новый экземпляр формата во всех этих местах, загружая также строку форматирования из файла (или свойство spring), вы можете использовать область действия прототипа, чтобы каждый раз получать свежий экземпляр, с подробностями установки общего формата в одном место.