Что произойдет, если попытаться получить один и тот же бин из 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.