Область действия компонента Spring определяет жизненный цикл и видимость экземпляров, созданных на основе определений компонента.
Эта статья посвящена — как внедрить компонент с более короткой областью действия, такой как prototype
, в другой компонент с более длительной областью действия, такой как singleton
. мы кратко обсудим соответствующие области применения bean.
Ниже приведены различные области применения, предоставляемые Spring framework:
- singleton — Для каждого ApplicationContext создается только один экземпляр компонента. Он живет и умирает вместе с ApplicationContext — таким образом, он обеспечивает самый длительный срок службы. Это область по умолчанию, и она есть у каждого компонента, управляемого Spring, если не предусмотрена другая область.
- prototype — Новый экземпляр компонента создается каждый раз, когда выполняется запрос для конкретного компонента. Таким образом, он имеет более короткий жизненный цикл.
Приведенные ниже области применимы только для веб-приложений Spring ApplicationContext (Приложение)
- запрос — Новый экземпляр компонента создается для каждого HTTP-запроса из одного определения компонента.
- session — Для HTTP-сеанса создается новый экземпляр компонента.
Spring также предоставляет глобальную сессию
, области применения
и websocket
также.
мы можем использовать @Scope
аннотация для предоставления области действия компоненту.
@Scope("prototype") public class Command { ... }
Для конфигурации XML мы должны добавить атрибут scope
в определение компонента.
Теперь, когда у нас есть небольшая информация о том, как работают области Spring Bean. Давайте проанализируем приведенные ниже фрагменты кода 😎:
@Component @Scope("singleton") //default public class CommandProcessor { @Autowired private Command command; public void processCommand() { command.run(); } }
Давайте проанализируем приведенные ниже фрагменты кода 😎:
@Component @Scope("prototype") public class Command { public void run(){ System.out.println("Command Run for hashCode - "+this.hashCode()); } }
Давайте проанализируем приведенные ниже фрагменты кода 😎:
@Component public class ProcessorApplication{ @Autowired CommandProcessor processor; @Override public void run() { processor.processCommand(); processor.processCommand(); processor.processCommand(); processor.processCommand(); }
Давайте проанализируем приведенные ниже фрагменты кода 😎:
давайте посмотрим, что у нас здесь есть —
Одноэлементный компонент с областью действия – Командный процессор
и Прототип компонента с областью действия — Команда
. Компонент Command Processor
также зависит от компонента Command
и вызывает метод Command.run()
.
У нас также есть компонент с одноэлементной областью действия — ProcessorApplication
bean, который вызывает метод CommandProcessor.process()
.
С точки зрения количества экземпляров, два экземпляра одноэлементного компонента для командного процессора
и Создается приложение процессора
.
Поскольку Command
bean имеет область действия прототипа. Я предполагаю, что у нас должно быть несколько его экземпляров.
Если вы запустите приведенный выше код, результат будет похож на приведенный ниже. Хэш-код возвращаемого экземпляра компонента Command
одинаков для всех вызовов метода run()
. Это означает, что только один экземпляр компонента Команда
создается, даже если у него есть область видимости prototype
.
Command Run for hashCode - 1155862258 Command Run for hashCode - 1155862258 Command Run for hashCode - 1155862258 Command Run for hashCode - 1155862258
Подождите 🤔 — Разве область прототипа не должна генерировать несколько экземпляров, поскольку она вызывается несколько раз? Ответ – Нет.
Несмотря на то, что зависимость имеет область действия Prototype , компонент Singleton создается один раз, и все его зависимости разрешаются в это время. Следовательно, даже несмотря на то, что Команда
имеет область действия прототипа, у нее все равно будет только один экземпляр, присутствующий в командном процессоре
bean.
Теперь очевидный вопрос здесь — что, если я хочу внедрить прототип компонента в одноэлементный, но все еще хочу, чтобы было создано несколько экземпляров, очень похоже на прототипное поведение ?
Что ж, Spring framework предоставляет множество вариантов, которые помогут в этом. Ниже мы подробно рассмотрим каждый из них.
Эта статья была первоначально опубликована @ initgrep.com . Вы можете проверить подробный пост |/здесь
Оригинал: “https://dev.to/irshsheik/spring-bean-scopes-and-lookup-method-injection-3h45”