Весна @PostConstruct и @PreDestroy

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

Spring @PostConstruct

Когда мы помечаем метод в Spring Bean аннотацией @PostConstruct, он выполняется после инициализации Spring Bean. Мы можем иметь только один метод, помеченный аннотацией @PostConstruct. Эта аннотация является частью API Common Annotations и входит в состав модуля JDK javax.annotation-api. Поэтому, если вы используете эту аннотацию в Java 9 или выше, вам придется явно добавить этот jar-файл в ваш проект. Если вы используете Maven, то следующую зависимость нужно добавить в проект.

<dependency>
	<groupId>javax.annotation</groupId>
	<artifactId>javax.annotation-api</artifactId>
	<version>1.3.2</version>
</dependency>

Если вы используете Java 8 или более раннюю версию, то вам не нужно добавлять вышеуказанную зависимость.

Spring @PreDestroy

Когда мы аннотируем метод Spring Bean аннотацией PreDestroy, он вызывается при удалении экземпляра бина из контекста. Это очень важный момент для понимания – если ваш область весеннего боба это “прототип”, то он не полностью управляется контейнером Spring и метод PreDestroy не будет вызван. Если есть метод с именем shutdown или close, то контейнер Spring попытается автоматически сконфигурировать их как методы обратного вызова при уничтожении бина.

Весна @PostConstruct и @PreDestroy Пример

Вот простой весенний бин с @PostConstruct и @PreDestroy методами.

package com.journaldev.spring;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

public class MyBean {

	public MyBean() {
		System.out.println("MyBean instance created");
	}

	@PostConstruct
	private void init() {
		System.out.println("Verifying Resources");
	}

	@PreDestroy
	private void shutdown() {
		System.out.println("Shutdown All Resources");
	}

	public void close() {
		System.out.println("Closing All Resources");
	}
}

Обратите внимание, что я также определил метод close, чтобы проверить, вызывается ли он, когда наш бин уничтожается или нет. Вот мой простой класс конфигурации весны.

package com.journaldev.spring;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

@Configuration
public class MyConfiguration {
	
    @Bean
    @Scope(value="singleton")
    public MyBean myBean() {
	return new MyBean();
    }
	
}

I don’t need to explicitly specify my bean as a singleton but I will later change its value to “prototype” and see what happens with @PostConstruct and @PreDestroy methods. Here is my main class where I am creating spring context and getting few instances of MyBean.

package com.journaldev.spring;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class MySpringApp {

	public static void main(String[] args) {
		AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
		ctx.register(MyConfiguration.class);
		ctx.refresh();

		MyBean mb1 = ctx.getBean(MyBean.class);
		System.out.println(mb1.hashCode());

		MyBean mb2 = ctx.getBean(MyBean.class);
		System.out.println(mb2.hashCode());

		ctx.close();
	}

}

Когда мы запускаем указанный класс, мы получаем следующий вывод.

MyBean instance created
Verifying Resources
1640296160
1640296160
Shutdown All Resources
Closing All Resources

Итак, метод @PostConstruct вызывается после создания бина. При закрытии контекста вызываются методы shutdown и close.

Spring @PostConstruct и @PreDestroy с областью видимости Prototype

Просто измените значение области видимости на prototype в MyConfiguration и запустите основной класс. Вы получите вывод, как показано ниже.

MyBean instance created
Verifying Resources
1640296160
MyBean instance created
Verifying Resources
1863374262

Таким образом, ясно, что контейнер Spring инициализирует бин при каждом запросе, вызывает его метод @PostConstruct, а затем передает его клиенту. После этого Spring больше не управляет бином, и в этом случае клиент должен выполнить все необходимые операции по очистке ресурсов, прямо вызывая метод PreDestroy.

Резюме

@PostConstruct и @PreDestroy – важные аннотации для использования в управлении жизненным циклом бинов Spring. Мы можем использовать их для проверки того, что бин был правильно инициализирован, а затем закрыть все ресурсы, когда бин удаляется из контекста Spring.

Вы можете ознакомиться с полным кодом проекта на нашем репозитории GitHub.

Source:
https://www.digitalocean.com/community/tutorials/spring-postconstruct-predestroy