Java for Beginner
672 subscribers
541 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 полностью контролирует создание, настройку и уничтожение бинов.

Этапы жизненного цикла бина в Spring

Жизненный цикл бина включает в себя несколько стадий:
Создание бина: контейнер IoC создает объект и управляет его инициализацией.
Внедрение зависимостей: если у бина есть зависимости, они автоматически разрешаются и внедряются
Spring.
Пост-инициализация: дополнительные операции, которые можно выполнить после создания объекта.
Использование бина: бин может быть использован в приложении.
Уничтожение бина: при завершении работы приложения
Spring уничтожает бины.

Жизненный цикл бина на примере

Создадим пример с бином, который отправляет сообщения, и реализуем этапы его жизненного цикла.


Пример класса с методами инициализации и уничтожения:
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.springframework.stereotype.Component;

@Component
public class MessageService {

public MessageService() {
System.out.println("Создание бина MessageService");
}

@PostConstruct
public void init() {
System.out.println("Инициализация бина MessageService");
}

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

@PreDestroy
public void destroy() {
System.out.println("Уничтожение бина MessageService");
}
}


Объяснение этапов:
Конструктор: при создании бина вызывается конструктор класса. Здесь мы видим, что при создании бина выводится сообщение "Создание бина MessageService".
Аннотация
@PostConstruct: после создания бина и внедрения всех зависимостей вызывается метод, помеченный этой аннотацией. В нашем примере это метод init(), который выводит сообщение "Инициализация бина MessageService".
Методы бина: после инициализации бин может быть использован для выполнения своих задач. В данном случае это метод sendMessage(), который выводит сообщение.
Аннотация
@PreDestroy: перед уничтожением бина вызывается метод, помеченный аннотацией @PreDestroy. В нашем примере это метод destroy(), который выводит сообщение "Уничтожение бина MessageService".

Использование интерфейсов для управления жизненным циклом

Spring также предоставляет интерфейсы для более детального управления жизненным циклом бинов:
InitializingBean: интерфейс с методом afterPropertiesSet(), который вызывается после внедрения зависимостей.
DisposableBean: интерфейс с методом destroy(), который вызывается при завершении работы приложения для уничтожения бина.


Пример реализации этих интерфейсов:
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;

@Component
public class CustomService implements InitializingBean, DisposableBean {

@Override
public void afterPropertiesSet() throws Exception {
System.out.println("Инициализация бина CustomService через afterPropertiesSet");
}

@Override
public void destroy() throws Exception {
System.out.println("Уничтожение бина CustomService через destroy");
}
}


#Java #Training #Spring #Spring_Bean_LifeCicle
Методы инициализации и уничтожения через XML

Если вы используете XML-конфигурацию, вы можете указать методы инициализации и уничтожения прямо в конфигурационном файле:
<bean id="messageService" class="com.example.MessageService" 
init-method="init" destroy-method="destroy"/>
Здесь init-method и destroy-method указывают на методы, которые будут вызваны при инициализации и уничтожении бина соответственно.


Singleton и Prototype: Различия в жизненном цикле

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


@Component
@Scope("prototype")
public class PrototypeBean {

public PrototypeBean() {
System.out.println("Создан новый экземпляр PrototypeBean");
}
}
При каждом запросе PrototypeBean будет создаваться новый объект.


Способы ручного управления жизненным циклом бинов

Иногда возникает необходимость вручную управлять жизненным циклом бинов, например, для освобождения ресурсов. Это можно сделать, используя метод close() у контекста:
AnnotationConfigApplicationContext context = 
new AnnotationConfigApplicationContext(AppConfig.class);

MessageService service = context.getBean(MessageService.class);
service.sendMessage("Привет, Spring!");

context.close();
Метод close() завершает работу контекста и вызывает методы уничтожения всех бинов.

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

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

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

public class Task221024_2 {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig221024.class);
MyBean myBean = context.getBean(MyBean.class);
myBean.doSomething();
context.close();
}
}

@Component
class MyBean implements InitializingBean, DisposableBean {

public MyBean() {
System.out.println("Constructor called");
}

@Override
public void afterPropertiesSet() {
System.out.println("afterPropertiesSet (init) called");
}

public void doSomething() {
System.out.println("Doing something");
}

@Override
public void destroy() {
System.out.println("destroy (cleanup) called");
}
}

@Configuration
@ComponentScan()
class AppConfig221024 {}


#TasksSpring