Sobes.tech
Middle

Ce se întâmplă dacă încerci să obții aceeași bean din ApplicationContext?

sobes.tech AI

Răspuns de la 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.