@PostConstruct and @PreDestroy examples in Java
In Java, @PostConstruct and @PreDestroy are two annotations that are used to perform actions before and after an object's lifecycle.
These annotations are part of the JakartaEE standards (ex-Java EE) and are commonly used in Spring-based applications.
@PostConstruct is used to annotate a method that needs to be executed after the object is constructed, but before it is put into service.
The method annotated with @PostConstruct is guaranteed to be called only once during the lifetime of the object, and it is typically used to perform any initialization tasks that are required before the object can be used.
Here is an example:
public class MyService {
private SomeDependency someDependency;
private AnotherDependency anotherDependency;
@PostConstruct
public void init() {
// perform initialization tasks here
someDependency.init();
anotherDependency.init();
}
// other methods and dependencies
@PreDestroy
public void cleanup() {
// perform cleanup tasks here
someDependency.cleanup();
anotherDependency.cleanup();
}
}
In this example, the init() method is annotated with @PostConstruct and it is called after the MyService object is constructed.
In the init() method, we perform any initialization tasks that are required before the object can be used.
Here, we call the init() method on two dependencies that are required by MyService.
@PreDestroy is used to annotate a method that needs to be executed before the object is destroyed.
The method annotated with @PreDestroy is guaranteed to be called only once during the lifetime of the object, and it is typically used to perform any cleanup tasks that are required before the object is destroyed.
Here is an example:
public class MyService {
private SomeDependency someDependency;
private AnotherDependency anotherDependency;
// other methods and dependencies
@PreDestroy
public void cleanup() {
// perform cleanup tasks here
someDependency.cleanup();
anotherDependency.cleanup();
}
}
In this example, the cleanup() method is annotated with @PreDestroy and it is called before the MyService object is destroyed.
In the cleanup() method, we perform any cleanup tasks that are required before the object is destroyed.
Here, we call the cleanup() method on two dependencies that are required by MyService.
Dependencies in Spring 3.x and Java 17: package javax.annotation does not exist
If you upgrade your application dependencies and you are still using javax.annotation.PostConstruct you will get a nice error like:
package javax.annotation does not exist
it's because the javax package has been removed in Java 11. Some websites suggest to import in your project:
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
... but like this you reintroduce the library (last version 2018) that Java decided to remove, better to use the new version of the library:
A much better solution is to use the updated versions of the annotation in your project:
import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;
probably you won't need extra dependencies, e.g. Spring Boot includes this dependency:
If you are using spring-boot-starter this dependency comes without any effort on your side.