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.
Filtering by tag: Java

Building Custom Spring AI Advisors for Tool Logging and Token Tracking
Learn to build custom Spring AI advisors with the BaseAdvisor interface to log available tools, track tool invocations, and count token usage on every LLM call.

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.

Introduction to Spring Modulith: Building Modular Monoliths with Spring Boot
Learn how Spring Modulith helps you build a modular monolith in Spring Boot with enforced module boundaries, application events, and verified architecture.

Embabel MCP Servers and Tools for Agentic Flows on the JVM
Add tools and MCP servers to your Embabel agents in Java. Build a blog writing agent that researches topics, calculates reading time, and generates front matter.

Embabel First Look: Building Agentic Flows on the JVM
A first look at Embabel, Rod Johnson's framework for building agentic AI flows on the JVM. Build a blog writing agent using goal-oriented action planning (GOAP).

GraphQL for Java Developers with Spring Boot
Build GraphQL APIs in Java with Spring Boot 4 and Spring for GraphQL. A free course covering schema-first design, batch loading, unions, and AOT repositories.

Spring, Build Me a Coding Agent
Build an autonomous coding agent in Spring AI with the Spring AI Agent Utils library. This tutorial adds file system tools, shell commands, and agent skills.

Getting Started with Error Handling in the RestClient
Learn best practices for error handling with Spring's RestClient, including global exception handlers, custom exceptions, Problem Detail responses, and built-in retry with resilience methods in Spring Framework 7.

JEP 500: Prepare to Make Final Mean Final in JDK 26
JDK 26 introduces JEP 500, which warns developers when final fields are mutated through reflection. Here's what this means for your Java code and how to prepare for the future.