Java for Beginner
672 subscribers
540 photos
155 videos
12 files
827 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Синглтон и Прототипы в Spring

Когда говорят о скоупах (областях видимости) бинов в Spring, обычно рассматривают два наиболее часто используемых типа — это Singleton (синглтон) и Prototype (прототип). Они определяют, как и когда создаются экземпляры объектов (бинов) и как управляется их временем жизни в приложении. Понимание различий между этими скоупами помогает разработчикам эффективно управлять ресурсами и объектами в приложении.

Что такое скоуп (Scope) бина?

Скоуп бина определяет жизненный цикл и количество экземпляров бина в контейнере Spring. Он регулирует, сколько объектов будет создано и как долго эти объекты будут существовать. Spring поддерживает несколько различных скоупов, но на практике наиболее популярными являются:
Singleton — бин создается один раз и существует на протяжении всего времени работы контейнера Spring.
Prototype — новый экземпляр бина создается каждый раз при запросе.


Singleton Scope (Синглтон)

Синглтон — это скоуп по умолчанию в
Spring. Когда бин имеет скоуп синглтона, контейнер создает только один его экземпляр для всего приложения. Этот бин будет использоваться повторно при каждом обращении к нему в течение времени работы приложения.

Пример использования синглтона

Создадим класс, который представляет собой сервис для отправки сообщений:
import org.springframework.stereotype.Component;

@Component
public class MessageService {
public MessageService() {
System.out.println("Создан объект MessageService");
}

public void sendMessage(String message) {
System.out.println("Отправка сообщения: " + message);
}
}


Теперь создадим приложение, которое использует этот бин несколько раз:

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class MainApp {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

// Получаем бин MessageService дважды
MessageService service1 = context.getBean(MessageService.class);
service1.sendMessage("Привет, Spring!");

MessageService service2 = context.getBean(MessageService.class);
service2.sendMessage("Второе сообщение");

// Проверим, что оба объекта одинаковы
System.out.println(service1 == service2); // true
}
}
В данном случае Spring создает только один экземпляр MessageService, и каждый раз при запросе через context.getBean() возвращается один и тот же объект. Сообщение в консоли "Создан объект MessageService" будет выведено только один раз.


Когда использовать Singleton?

Синглтон хорош для использования в ситуациях, когда объект должен быть уникален для всего приложения и его состояние не должно изменяться между различными вызовами.

Примеры:
Сервисы, которые обеспечивают кэширование данных.
Сервисы для доступа к базе данных, где создаётся пул соединений.
Управляющие объекты, которые контролируют общий процесс приложения.


#Java #Training #Spring #Spring_Singleton
Что выведет код?

Задача по Spring. Тема: #Spring_Prototype и #Spring_Singleton. Сложность средняя.

Подробный разбор через 30 минут!🫡

import org.springframework.context.annotation.*;

@Configuration
class Config {
@Bean
@Scope("singleton")
public MyBean2310 singletonBean() {
return new MyBean2310("singleton");
}

@Bean
@Scope("prototype")
public MyBean2310 prototypeBean() {
return new MyBean2310("prototype");
}
}

class MyBean2310 {
public MyBean2310(String scope) {
System.out.println("MyBean created for "+scope);
}
}

public class Task231024_2 {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);

MyBean2310 singleton1 = context.getBean("singletonBean", MyBean2310.class);
MyBean2310 singleton2 = context.getBean("singletonBean", MyBean2310.class);

MyBean2310 prototype1 = context.getBean("prototypeBean", MyBean2310.class);
MyBean2310 prototype2 = context.getBean("prototypeBean", MyBean2310.class);

context.close();
}
}


#TasksSpring