IntelliJ IDEA
IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin
Java Annotated Monthly – November 2025
This edition is packed with insightful, practical, and curiosity-fueling reads. From hands-on advice to thought-provoking pieces, we’ve gathered a nice selection of stories that will help you stay sharp and inspired in the tech world.
We’re also happy to have Josh Long as our featured content author this month! Expect some top-notch insights and a good dose of Spring.
So, grab your coffee and dive in – there’s plenty worth reading inside!
Featured Content
Hi, Spring fans! Spring Boot 4 comes out in November 2025! With this in mind, lLet’s at least look at some of my favorite features together. Jakarta EE 11 is the new baseline. We’ve retained a Java 17 baseline but strongly encourage a Java 25 posture whenever possible. We’ve moved the baseline to GraalVM 25 for native images and updated our Kotlin support to Kotlin 2.2. The new generation of projects assumes the new Jackson 3. We’ve introduced JSpecify nullability annotations across the portfolio to finally eliminate Tony Hoare’s $1 billion dollar mistake – null references. Spring Boot 4 has decomposed the autoconfiguration artifact into smaller, more modular autoconfigurations.
One of my favorite new features is API versioning. Here’s a Spring MVC controller with two endpoints, each designated a particular version, the default version of which we can specify with spring.mvc.apiversion.default=1.1.
@RestController
class DogsController {
...
@GetMapping(value = "/dogs",version="1.0")
Collection<Map<String, Object>> dogsClassic() {
...
}
@GetMapping(value = "/dogs", version = "1.1")
Collection<Dog> dogs() {
...
}
}
I also love the new easy-mode declarative HTTP clients. Let’s build a client to talk to the Cat Facts API and then activate it using @ImportHttpServices(CatFacts.class):
record CatFact(@JsonProperty("fact_number") int factNumber, String fact) { }
record CatFactsResponse(Collection<CatFact> facts) { }
interface CatFacts {
@GetExchange("https://www.catfacts.net/api")
CatFactsResponse facts();
}
We built a simple client, and it should work, but what if the service is down? In this case, we can enable resilient methods with Spring’s new @EnableResilientMethods annotation. This gives us two new features: @ConcurrencyLimit and @Retryable (and the related RetryTemplate).
...
@ConcurrencyLimit(10)
@Retryable(maxAttempts = 4, includes = BadException.class)
@GetMapping("/facts")
Collection<CatFact> facts() throws Exception {
...
}
...
Spring Framework 7 brings BeanRegistrar configuration, which is a more dynamic alternative to Java configuration that can be used in conjunction with Java configuration and component scanning with the usual @Import annotation.
class MyBeanRegistrar implements BeanRegistrar {
@Override
public void register(BeanRegistry registry, Environment env) {
registry.registerBean(Runner.class);
registry.registerBean(Runner.class, spec -> spec
.description("description")
.supplier(supplierContext -> new Runner(
supplierContext.bean(DogRepository.class), supplierContext.beanProvider(CatFacts.class)
.getIfUnique())
));
}
}
Spring Security brings with it a lot of nice new features. Two of my favorites are multi-factor auth, allowing you to require that multiple authentication factors be present, and Customizer<HttpSecurity> beans for additive changes to the HttpSecurity configuration.
@EnableGlobalMultiFactorAuthentication(
authorities = { FactorGrantedAuthority.PASSWORD_AUTHORITY, FactorGrantedAuthority.OTT_AUTHORITY })
@Configuration
class SecurityConfiguration {
@Bean
Customizer<HttpSecurity> httpSecurityCustomizer() {
return httpSecurity -> httpSecurity
.webAuthn(w -> ... )
.oneTimeTokenLogin(ott -> ... );
}
}
The code is here for your reference. I encourage users to kick the tires and try everything out on the Spring Initializer – and enjoy your journey to production!
Java News
Stay in the loop with the latest from the Java world:
- Java News Roundup 1, 2, 3, 4
- The Inside Java Newsletter: Java 25 is Live!
- HTTP/3 Support in JDK 26
- Three G1 Improvements – Inside Java Newscast #99
- JEP targeted to JDK 26: 517: HTTP/3 for the HTTP Client API
- Try Out JEP 401 Value Classes and Objects
- JEP targeted to JDK 26: 504: Remove the Applet API
Java Tutorials and Tips
Keep exploring pro tips that make your Java experience even better:
- Rating 26 years of Java changes
- Be more productive with IntelliJ IDEA by Marit van Dijk
- Java and AI: Powering Scalable, Enterprise-Grade Intelligence
- “Just Make All Exceptions Unchecked” – Live Q&A from Devoxx
- Pattern Matching, Under the Microscope
- Structured Concurrency in Action
- 7 Habits of Highly Effective Java Coding
- Java for AI
- Java and AI: Powering Scalable, Enterprise-Grade Intelligence
- What’s New in Java 25 in 25 Minutes – Sip of Java
- From JDK 21 to JDK 25 – Java Performance Update 2025
- Performance Improvements in JDK 25
- AI World: Georges Saab Unveils Java 25 for AI and Cloud
- Assembling Project Leyden #JVMLS
- Type conversion in Java – an alternative proposal for primitive type patterns
Kotlin Corner
Your dose of Kotlin news and tips is here:
- What’s new in Kotlin 2.2.21 (and 2.2.20!)
- Discussing Kotlin Coroutines with Marcin Moskała | Talking Kotlin 141
- Your First AI Agent in Kotlin
- Koog 0.5.0 Is Out: Smarter Tools, Persistent Agents, and Simplified Strategy Design
- Koog × A2A: Building Connected AI Agents in Kotlin
- Non-graph strategies, and when to use them in AI agents
- Context parameters and API design
- The Country That Broke Kotlin
- Baking with functions: A guide to higher-order functions and lambdas in Kotlin
- Better immutability in Kotlin with Valhalla #JVMLS
AI
Don’t miss what’s buzzing in the AI world:
- The Launch of Developer Productivity AI Arena: An Open Platform for Benchmarking AI Coding Agents
- Fault tolerant AI Agents on the JVM with Koog framework by Vadim Briliantov
- Beyond the Hype: Architecting Systems with Agentic AI
- Introducing Matter: The AI Development Companion for Product Teams
- Agents Meet Databases: The Future of Agentic Architectures
- Foojay Podcast #79: AI4Devs Interviews – Part 1
- Infusing AI into Your Java Applications
- OpenAI Study Investigates the Causes of LLM Hallucinations and Potential Solutions
- Why Observability Matters (More!) with AI Applications
- OpenAI Launches ChatGPT Atlas, a Browser With ChatGPT Built In
Languages, Frameworks, Libraries, and Technologies
Explore everything new and exciting in tech right here:
- This Week in Spring 1, 2, 3, 4
- Securing MCP Servers with Spring AI
- Modularizing Spring Boot
- Beyond Keywords: Implementing Semantic Search in Java With Spring Data (Part 1)
- Transactions and ThreadLocal in Spring
- Explore Spring Framework 7 Features—API Versioning
- HTTP/3 Support in JDK 26
- How to use the Develocity IntelliJ plugin to speed up Gradle builds with real-time insights
- Transactions and ThreadLocals in Spring
- Spring Debugger: Behind The Scenes of Spring Boot by Marco Behler
- A Bootiful Podcast: Dr. Kris De Volder on developer tooling for Spring developers and AI
- Why Good APIs Are Like Ogres
- On dependencies in objects
- Six and a half ridiculous things to do with Quarkus
- A Bootiful Podcast: Spring Security contributor Josh Cummings on the latest-and-greatest in Spring Security 7
- What Happens When 10,000 JVMs Collaborate in One Production Environment
- Make Your GitHub Profile Update Itself (WordPress posts, GitHub releases, LinkedIn newsletters)
- Spring Session MongoDB: Now Led by MongoDB Team
- Introducing JUnit 6: What’s New and How to Test Kotlin Suspend Functions
- Working with Geo Location Data
- Keywords Meet Vectors: Hybrid Search on MongoDB
- Cloud and DevOps InfoQ Trends Report 2025
- Creating a Javelit chat interface for LangChain4j
- Going Further With One Outcome per Test
- Testing the untestable
Conferences and Events
Plan your visits:
- ChurConf – Auckland, New Zealand, November 2
- W-Jax – Online or Munich, Germany, November 3–7
- Øredev – Malmö, Sweden, November 5–7
- JFall – Pathé Ede, Netherlands, November 6
- Voxxed Days Thesalloniki – Thesalloniki, Greece, November 7–8
- JavaFest India – Bengaluru, India, November 8
- Devoxx Morocco – Marrakech, Morocco, November 12–14
- Using IntelliJ with Develocity AI for faster troubleshooting – Online, November 13
- JJUG CCC Fall – Tokyo, Japan, November 15
Culture and Community
Let the articles below spark some inspiration and reflection:
- How Software Engineers Can Grow into Staff Plus Roles
- Creating Impactful Teams Across Diverse Work Environments
- How to Always Get Invited to Big Strategic Conversations
- Why Software Engineering Governance Matters: Reducing Risk without Slowing down
- Entropy: Why Life Always Seems to Get More Complicated
That’s it for today! We’re always collecting ideas for the next Java Annotated Monthly – send us your suggestions via email or X by November 20. Don’t forget to check out our archive of past JAM issues for any articles you might have missed!
