Рубрики
Без рубрики

Области действия Spring Bean и внедрение метода поиска

Область Spring Bean определяет жизненный цикл и видимость экземпляров, созданных из компонента… Помеченный как spring, java, all.

Область действия компонента 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”