Назад к вопросам
Middle
69
questionbank

Что произойдет, если попытаться получить один и тот же бин из ApplicationContext?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Если бин имеет область видимости (scope) singleton (по умолчанию), то при каждом запросе к ApplicationContext будет возвращаться один и тот же экземпляр объекта.

Если бин имеет область видимости prototype, то при каждом запросе будет создаваться и возвращаться новый экземпляр объекта.

Другие области видимости (например, request, session в веб-приложениях) также влияют на то, какой экземпляр бина будет получен.

Пример для singleton:

// Bин с областью видимости singleton (по умолчанию)
@Component
public class SingletonBean {
    private static int count = 0;
    private int instanceId;

    public SingletonBean() {
        count++;
        instanceId = count;
        System.out.println("SingletonBean instance created: " + instanceId);
    }

    public int getInstanceId() {
        return instanceId;
    }
}

Получение бина несколько раз:

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

SingletonBean bean1 = context.getBean(SingletonBean.class);
SingletonBean bean2 = context.getBean(SingletonBean.class);

System.out.println("Bean 1 instance ID: " + bean1.getInstanceId()); // Output: Bean 1 instance ID: 1
System.out.println("Bean 2 instance ID: " + bean2.getInstanceId()); // Output: Bean 2 instance ID: 1

context.close();

В консоли будет напечатано только одно сообщение создания экземпляра: SingletonBean instance created: 1.

Пример для prototype:

// Bин с областью видимости prototype
@Component
@Scope("prototype")
public class PrototypeBean {
    private static int count = 0;
    private int instanceId;

    public PrototypeBean() {
        count++;
        instanceId = count;
        System.out.println("PrototypeBean instance created: " + instanceId);
    }

    public int getInstanceId() {
        return instanceId;
    }
}

Получение бина несколько раз:

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

PrototypeBean bean1 = context.getBean(PrototypeBean.class);
PrototypeBean bean2 = context.getBean(PrototypeBean.class);

System.out.println("Bean 1 instance ID: " + bean1.getInstanceId()); // Output: Bean 1 instance ID: 1
System.out.println("Bean 2 instance ID: " + bean2.getInstanceId()); // Output: Bean 2 instance ID: 2

context.close();

В консоли будет напечатано два сообщения создания экземпляра: PrototypeBean instance created: 1 и PrototypeBean instance created: 2.

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