One of the most powerful additions is AOT (Ahead-Of-Time) compilation. To build a native image:
<dependencies> <!-- Web & REST --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Data JPA --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!-- PostgreSQL / H2 --> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <scope>runtime</scope> </dependency> <!-- Observability --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing-bridge-brave</artifactId> </dependency> <!-- Testing --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> spring boot 3 project
Enable standardized error responses:
// Usage @RestController public class UserController private final UserClient userClient; One of the most powerful additions is AOT
@HttpExchange(url = "/api/users") public interface UserClient @GetExchange("/id") User getUser(@PathVariable Long id); @PostExchange User createUser(@RequestBody User user); !-- Web & REST -->