«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();
    }
}

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

4. Java 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.