Перейти к основному содержимому

Аннотации Spring PostConstruct и PreDestroy

· 2 мин. чтения

1. Введение

Spring позволяет нам прикреплять пользовательские действия к созданию и уничтожению бина . Мы можем, например, реализовать интерфейсы InitializingBean и DisposableBean .

В этом кратком руководстве мы рассмотрим второй вариант — аннотации @PostConstruct и @PreDestroy .

2. @PostConstruct

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

Метод, аннотированный @PostConstruct , может иметь любой уровень доступа, но не может быть статическим.

Одно из возможных применений @PostConstruct — заполнение базы данных. Например, во время разработки мы можем захотеть создать некоторых пользователей по умолчанию:

@Component
public class DbInit {

@Autowired
private UserRepository userRepository;

@PostConstruct
private void postConstruct() {
User admin = new User("admin", "admin password");
User normalUser = new User("user", "user password");
userRepository.save(admin, normalUser);
}
}

В приведенном выше примере сначала будет инициализирован UserRepository, а затем запущен метод @PostConstruct .

3. @PreDestroy

Метод, аннотированный @PreDestroy , запускается только один раз, непосредственно перед тем, как Spring удалит наш компонент из контекста приложения.

Как и в случае с @PostConstruct , методы, аннотированные с помощью @PreDestroy , могут иметь любой уровень доступа, но не могут быть статическими.

@Component
public class UserRepository {

private DbConnection dbConnection;
@PreDestroy
public void preDestroy() {
dbConnection.close();
}
}

Целью этого метода должно быть освобождение ресурсов или выполнение других задач очистки, таких как закрытие соединения с базой данных, до того, как компонент будет уничтожен.

4. Ява 9+

Обратите внимание, что аннотации @PostConstruct и @PreDestroy являются частью Java EE. Поскольку Java EE устарела в Java 9 и удалена в Java 11, мы должны добавить дополнительную зависимость для использования этих аннотаций:

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

5. Вывод

В этой краткой статье мы узнали, как использовать аннотации @PostConstruct и @PreDestroy .

Как всегда, весь исходный код доступен на GitHub .