Practical writing on Java, Spring, AI, and the craft of software engineering.

If you're building with Java and Spring (or trying to figure out where AI fits into your development workflow) you're in the right place. I write practical, beginner-friendly deep dives on Spring Boot, Spring AI, and software engineering fundamentals, collected here in chronological order.

ChatClient vs ChatModel: Which Spring AI API Should You Actually Use?
· 14 min read

ChatClient vs ChatModel: Which Spring AI API Should You Actually Use?

Spring AI gives you two ways to call an LLM. Learn the difference between ChatClient and ChatModel, when to use each, and see both in action with code examples.

X (Twitter) MCP Servers with Spring AI: Search Posts and Query Docs Programmatically
· 19 min read

X (Twitter) MCP Servers with Spring AI: Search Posts and Query Docs Programmatically

X released MCP servers for its API and docs. Build a Spring Boot MCP client with Spring AI 2.0 to search X posts and query the X API docs programmatically.

Type Safe Property Paths in Spring Boot 4.1
· 18 min read

Type Safe Property Paths in Spring Boot 4.1

Spring Boot 4.1 adds type-safe property paths to Spring Data, replacing stringly typed references in sorting, criteria queries, and composite paths.

The New @RedisListener Annotation in Spring Boot 4.1
· 10 min read

The New @RedisListener Annotation in Spring Boot 4.1

Spring Boot 4.1 adds @RedisListener, one annotation that brings Redis Pub/Sub in line with @KafkaListener and @RabbitListener. No container wiring needed.

SSRF Protection in Spring Boot 4.1 with InetAddressFilter
· 13 min read

SSRF Protection in Spring Boot 4.1 with InetAddressFilter

Learn how Spring Boot 4.1's new InetAddressFilter protects your applications against Server-Side Request Forgery (SSRF) attacks with a single bean definition.

Lazy JDBC Connections in Spring Boot 4.1: One Property, Massive Performance Win
· 15 min read

Lazy JDBC Connections in Spring Boot 4.1: One Property, Massive Performance Win

Spring Boot 4.1 adds lazy JDBC connection fetching via spring.datasource.connection-fetch. See how it cuts connection hold time from 2 seconds to 15ms.

Getting Started with Spring gRPC in Spring Boot 4.1
· 13 min read

Getting Started with Spring gRPC in Spring Boot 4.1

Build a gRPC server and client in Spring Boot 4.1 with Spring gRPC — using @GrpcService, protobuf, and the new starters from start.spring.io.

Spring Modulith Externalized Events: Publishing Events to Kafka
· 17 min read

Spring Modulith Externalized Events: Publishing Events to Kafka

Learn how to externalize Spring Modulith application events to Apache Kafka so other systems can react to changes happening inside your modular monolith.

Spring Boot + Kafka in 10 Minutes: Sending Your First Message
· 18 min read

Spring Boot + Kafka in 10 Minutes: Sending Your First Message

Produce and consume your first Apache Kafka message with Spring Boot. Covers Docker Compose, KafkaTemplate, @KafkaListener, and Embedded Kafka for tests.