Home Java Creating Custom Spring Boot Starters: Auto-Configuration and Conditionals
Advanced 5 min · July 14, 2026

Creating Custom Spring Boot Starters: Auto-Configuration and Conditionals

Learn to build production-ready Spring Boot starters with auto-configuration and conditionals.

N
Naren Founder & Principal Engineer

20+ years shipping production Java in banking & fintech. Notes here come from systems that actually shipped.

Follow
Production
production tested
July 15, 2026
last updated
2,398
articles · all by Naren
Before you start⏱ 15-20 min read
  • Java 17+ installed
  • Maven 3.9+ or Gradle 8+
  • Spring Boot 3.2+ project (any existing app will do)
  • Basic understanding of dependency injection and application.properties
 ● Production Incident 🔎 Debug Guide ⚙ Triage Commands
Quick Answer

• A Spring Boot starter is a library that bundles auto-configuration, dependencies, and property defaults so you can add a feature with a single dependency. • Use @ConditionalOnClass, @ConditionalOnProperty, and @ConditionalOnMissingBean to make auto-configuration smart and optional. • Always provide a spring.factories or org.springframework.boot.autoconfigure.AutoConfiguration.imports file to register your auto-configuration class. • Test with @SpringBootTest and custom properties to verify conditionals behave correctly in different environments. • Version your starter independently of the consuming application to avoid dependency hell.

✦ Definition~90s read
What is Creating Custom Spring Boot Starters?

A custom Spring Boot starter is a JAR that you create, which includes auto-configuration classes, optional dependencies, and property defaults, so that when another project adds your starter as a dependency, Spring Boot automatically configures the beans and behavior you've defined — without the user having to write any boilerplate.

Imagine you're building a modular kitchen appliance.
Plain-English First

Imagine you're building a modular kitchen appliance. A Spring Boot starter is like a pre-assembled blender attachment — you just click it onto the base (your Spring Boot app) and it works. Auto-configuration is the "smart plug" that detects whether you have fruit (a dependency) and only activates the blender if you do. Conditionals are the safety switches that prevent the blender from running if the lid is off (missing bean or property).

Spring Boot starters are the backbone of modern microservice architectures. They let you add complex functionality — from database access to messaging to security — with a single dependency in your pom.xml. But what if the starter you need doesn't exist? Or what if your organization has internal libraries that should be auto-configured? That's when you build your own. Creating a custom Spring Boot starter is a rite of passage for senior developers. It forces you to understand auto-configuration mechanics, conditional annotations, and the delicate dance between convention and configuration. In this tutorial, we'll build a production-ready starter for a SaaS billing service. You'll learn how to register auto-configuration classes, apply conditionals that respect the user's environment, and test everything like a pro. We'll also cover the pitfalls — like classpath scanning order and property binding quirks — that have caused midnight PagerDuty alerts for many of us. By the end, you'll have a reusable starter that can be dropped into any Spring Boot 3.2+ project and just work. Let's get our hands dirty.

What is a Spring Boot Starter?

A Spring Boot starter is a Maven or Gradle module that bundles together all the dependencies and auto-configuration needed to enable a feature. When you add spring-boot-starter-web to your project, you get Tomcat, Jackson, Spring MVC, and a pile of auto-configured beans. The magic happens because Spring Boot scans for META-INF/spring.factories (or the newer org.springframework.boot.autoconfigure.AutoConfiguration.imports file) to discover auto-configuration classes. These classes use conditional annotations to decide what to configure based on the classpath, properties, and existing beans. For example, spring-boot-starter-data-redis only creates a RedisConnectionFactory if you have the Lettuce or Jedis driver on the classpath. This design means starters are additive: you can stack them without conflicts. But when you build your own, you must follow the same contract. Let's build a starter for a fictional billing service called "ChargeBee Lite" that provides a PaymentGateway interface and a default implementation using Stripe.

BillingAutoConfiguration.javaJAVA
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.example.billing.starter;

import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;

@AutoConfiguration
@ConditionalOnClass(StripeClient.class)
@EnableConfigurationProperties(BillingProperties.class)
public class BillingAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public PaymentGateway paymentGateway(BillingProperties props) {
        return new StripePaymentGateway(props.getApiKey());
    }
}
Output
Auto-configuration class that creates a StripePaymentGateway if StripeClient is on the classpath and no other PaymentGateway bean exists.
⚠ Don't Use @Configuration
📊 Production Insight
Always keep auto-configuration classes in a separate package from your library's API classes. This prevents accidental component scanning by the consuming application.
🎯 Key Takeaway
A starter is just a JAR with an auto-configuration class registered in spring.factories or AutoConfiguration.imports. The conditionals make it smart.

What the Official Docs Won't Tell You

The official Spring Boot documentation tells you to use @ConditionalOnClass and spring.factories. It doesn't tell you about the silent failures when your starter's auto-configuration class is loaded but the conditionals fail silently. I've spent hours debugging a starter that worked in unit tests but not in production — the culprit was a missing transitive dependency that the conditionals didn't detect because they only check class presence, not method availability. Another hidden gotcha: property binding with @ConfigurationProperties. If your starter defines properties in a prefix like "billing.api-key", the user must use kebab-case in application.yml. But if they use camelCase (billing.apiKey), it still works — until they upgrade Spring Boot and the relaxed binding rules change. The docs also gloss over ordering. If two starters both try to configure a DataSource, the one with @AutoConfigureBefore wins. Without explicit ordering, the result is unpredictable. Finally, never rely on @ComponentScan in your starter — it defeats the purpose of auto-configuration and can cause bean duplication. Always use explicit @Bean methods with conditionals.

BillingProperties.javaJAVA
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.example.billing.starter;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = "billing")
public class BillingProperties {

    private String apiKey;
    private String webhookSecret;
    private boolean enabled = true;

    public String getApiKey() { return apiKey; }
    public void setApiKey(String apiKey) { this.apiKey = apiKey; }
    public String getWebhookSecret() { return webhookSecret; }
    public void setWebhookSecret(String webhookSecret) { this.webhookSecret = webhookSecret; }
    public boolean isEnabled() { return enabled; }
    public void setEnabled(boolean enabled) { this.enabled = enabled; }
}
Output
Configuration properties class with prefix 'billing'. Users set billing.api-key in application.yml.
🔥Property Binding in Spring Boot 3.2
📊 Production Insight
Add a spring-configuration-metadata.json file to your starter JAR. This enables IDE autocompletion for your properties. Generate it using the spring-boot-configuration-processor dependency.
🎯 Key Takeaway
Conditionals are powerful but not magical. Always test with the exact classpath your consumers will use. Document property binding conventions clearly.

Registering Auto-Configuration

Spring Boot discovers auto-configuration classes via the file META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. This file (introduced in Spring Boot 2.7) replaces the older spring.factories approach. Each line contains the fully qualified name of an auto-configuration class. For backward compatibility, you can still use spring.factories, but the new method is preferred. Create the file in src/main/resources/META-INF/spring/. The order of classes in this file matters: Spring Boot processes them in order, but you can override ordering with @AutoConfigureBefore and @AutoConfigureAfter annotations. For our billing starter, we'll register BillingAutoConfiguration. If your starter depends on another auto-configuration (like DataSourceAutoConfiguration), list it after in the imports file or use @AutoConfigureAfter. A common mistake is forgetting to include this file — the starter will compile but do nothing at runtime. I've seen teams waste days wondering why their beans aren't created, only to find the imports file missing.

AutoConfiguration.importsJAVA
1
2
com.example.billing.starter.BillingAutoConfiguration
com.example.billing.starter.BillingWebhookAutoConfiguration
Output
File located at src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
⚠ Don't Mix Old and New
📊 Production Insight
Add a test that loads the auto-configuration class via SpringFactoriesLoader to ensure the file is present and the class is loadable.
🎯 Key Takeaway
The AutoConfiguration.imports file is the entry point. Without it, your starter is just a JAR with dead code. Always verify it's packaged correctly.

Conditional Annotations Deep Dive

Spring Boot provides a rich set of conditional annotations that control whether a bean or configuration class is loaded. The most common ones are @ConditionalOnClass (checks if a class is on the classpath), @ConditionalOnMissingBean (checks if a bean of a given type doesn't exist), @ConditionalOnProperty (checks if a property has a specific value), and @ConditionalOnExpression (evaluates a SpEL expression). You can combine them on the same class or method. For our billing starter, we want to enable the Stripe integration only if the Stripe SDK is present and the property 'billing.enabled' is true (default true). We also want to allow users to provide their own PaymentGateway implementation. The order of evaluation matters: @ConditionalOnClass is checked first, then @ConditionalOnProperty, then @ConditionalOnMissingBean. If any condition fails, the entire configuration class is skipped. This is important for performance — you don't want to load beans if the required library isn't even on the classpath. A common mistake is putting @ConditionalOnMissingBean on the class level instead of the method level. If you do that, the entire configuration class is skipped if the bean exists, which prevents other beans in the same class from being created.

ConditionalBillingAutoConfiguration.javaJAVA
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.example.billing.starter;

import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;

@AutoConfiguration
@ConditionalOnClass(name = "com.stripe.Stripe")
@ConditionalOnProperty(prefix = "billing", name = "enabled", havingValue = "true", matchIfMissing = true)
@EnableConfigurationProperties(BillingProperties.class)
public class ConditionalBillingAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public PaymentGateway paymentGateway(BillingProperties props) {
        return new StripePaymentGateway(props.getApiKey());
    }

    @Bean
    @ConditionalOnMissingBean
    public WebhookHandler webhookHandler(BillingProperties props) {
        return new StripeWebhookHandler(props.getWebhookSecret());
    }
}
Output
Configuration that only activates when Stripe SDK is present and billing.enabled is true (or not set).
🔥matchIfMissing is Your Friend
📊 Production Insight
Avoid @ConditionalOnExpression in production starters — SpEL expressions are evaluated at runtime and can cause startup failures if the expression is malformed. Prefer @ConditionalOnProperty with well-defined values.
🎯 Key Takeaway
Use class-level conditionals for broad checks (library presence, feature toggle) and method-level conditionals for bean-specific overrides (user-provided beans).

Structuring Your Starter Project

A well-structured starter project has two modules: the autoconfigure module and the starter module. The autoconfigure module contains the auto-configuration classes, property classes, and conditionals. The starter module is an empty JAR that pulls in the autoconfigure module and the required third-party dependencies. This separation allows users to depend on the autoconfigure module directly if they want to customize the configuration. For our billing starter, the autoconfigure module includes BillingAutoConfiguration, BillingProperties, and the StripePaymentGateway implementation. The starter module depends on the autoconfigure module and the Stripe SDK. The user only needs to add the starter module to their project. This pattern is used by all official Spring Boot starters. Another best practice: keep your API interfaces (like PaymentGateway) in a separate API module that has no Spring dependencies. This allows users to implement the interface without pulling in Spring Boot. I've seen projects where the API interface was in the autoconfigure module, forcing users to depend on Spring Boot just to implement a simple interface. Don't do that.

pom.xml (starter module)XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example.billing</groupId>
    <artifactId>billing-spring-boot-starter</artifactId>
    <version>1.0.0</version>
    <dependencies>
        <dependency>
            <groupId>com.example.billing</groupId>
            <artifactId>billing-spring-boot-autoconfigure</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.stripe</groupId>
            <artifactId>stripe-java</artifactId>
            <version>24.0.0</version>
        </dependency>
    </dependencies>
</project>
Output
Starter module POM that pulls in autoconfigure and the Stripe SDK.
🔥Module Naming Convention
📊 Production Insight
Publish your autoconfigure module as a separate artifact. Some users may want to exclude the default implementation and provide their own, and they can depend only on the autoconfigure module.
🎯 Key Takeaway
Separate API, autoconfigure, and starter modules. The starter module is a thin aggregator that users depend on.

Testing Your Custom Starter

Testing a custom starter requires a different approach than testing a regular application. You need to verify that the auto-configuration activates under the right conditions and deactivates under others. Use @SpringBootTest with a minimal application context. For our billing starter, we'll write tests that verify: 1) When Stripe SDK is on the classpath and billing.enabled is true, the PaymentGateway bean is created. 2) When Stripe SDK is missing, the bean is not created. 3) When the user provides their own PaymentGateway bean, the starter's bean is not created. To simulate missing classes, use a custom TestCondition or exclude the Stripe dependency from the test classpath. Spring Boot 3.2 introduced @ConditionalOnClass with a name attribute that accepts string class names, making it easier to test without the actual library. For property-based tests, use @TestPropertySource or @DynamicPropertySource. A common mistake is testing only the happy path and assuming conditionals work. Always test the negative cases: missing properties, missing classes, and existing beans.

BillingAutoConfigurationTest.javaJAVA
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;

import static org.assertj.core.api.Assertions.assertThat;

class BillingAutoConfigurationTest {

    private final ApplicationContextRunner runner = new ApplicationContextRunner()
            .withConfiguration(AutoConfigurations.of(BillingAutoConfiguration.class));

    @Test
    void shouldCreatePaymentGatewayWhenStripePresent() {
        runner.withPropertyValues("billing.api-key=test_key")
              .run(context -> {
                  assertThat(context).hasSingleBean(PaymentGateway.class);
              });
    }

    @Test
    void shouldNotCreatePaymentGatewayWhenDisabled() {
        runner.withPropertyValues("billing.enabled=false")
              .run(context -> {
                  assertThat(context).doesNotHaveBean(PaymentGateway.class);
              });
    }

    @Test
    void shouldRespectUserDefinedBean() {
        runner.withBean(CustomPaymentGateway.class)
              .run(context -> {
                  assertThat(context).hasSingleBean(PaymentGateway.class);
                  assertThat(context).getBean(PaymentGateway.class)
                          .isInstanceOf(CustomPaymentGateway.class);
              });
    }
}
Output
Test using ApplicationContextRunner to verify conditional behavior without starting a full server.
⚠ Don't Use @SpringBootTest for Unit Tests
📊 Production Insight
Add a test that loads your starter's AutoConfiguration.imports file to ensure it's correctly packaged. Use ClassPathResource to verify the file exists.
🎯 Key Takeaway
Test all conditional paths: present, missing, disabled, and overridden. Use ApplicationContextRunner for fast, isolated tests.

Production Debugging and Monitoring

When a custom starter misbehaves in production, the first step is to determine whether the auto-configuration was applied. Enable debug logging for your starter's package by adding 'logging.level.com.example.billing.starter=DEBUG' to application.yml. This will show you which conditionals matched and which didn't. Spring Boot also exposes an autoconfigure endpoint via Actuator: GET /actuator/conditions. This endpoint shows all auto-configuration classes and their match/unmatch status. If your starter's class is listed as unmatched, the 'not matched' section will tell you why — for example, 'ConditionalOnClass did not find required class com.stripe.Stripe'. This is invaluable for debugging. Another technique: use Spring Boot's --debug flag to print the autoconfigure report at startup. I once debugged a production issue where the starter's bean was created twice — the autoconfigure report showed two matching entries because the user had accidentally included both the starter and the autoconfigure module as dependencies. The report made it obvious.

application.yml (debug config)YAML
1
2
3
4
5
6
7
8
9
logging:
  level:
    com.example.billing.starter: DEBUG

management:
  endpoints:
    web:
      exposure:
        include: conditions
Output
Configuration to enable debug logging and expose the conditions Actuator endpoint.
🔥Actuator Conditions Endpoint
📊 Production Insight
Add a custom health indicator in your starter that checks if the expected beans are created. This provides a proactive alert if the starter fails to configure.
🎯 Key Takeaway
Use debug logging and the Actuator conditions endpoint to diagnose auto-configuration issues in production. Don't guess — check the report.

Advanced Techniques: Conditional Evaluation Order

When you have multiple auto-configuration classes in your starter, the order of evaluation matters. Use @AutoConfigureBefore and @AutoConfigureAfter to specify ordering. For example, if your billing starter needs a DataSource to store transactions, you should annotate your configuration with @AutoConfigureAfter(DataSourceAutoConfiguration.class). This ensures the DataSource is available when your beans are created. Another advanced technique is using @ConditionalOnBean with a specific bean name or type. This is useful when your starter should only activate if another starter's bean is present. For example, your billing starter might only create a webhook endpoint if Spring Security is configured. Use @ConditionalOnBean(SecurityFilterChain.class) on the webhook configuration. Be careful with circular dependencies — if two starters depend on each other's beans, you'll get a startup failure. Finally, you can create custom conditionals by implementing the Condition interface. This is useful for complex logic that can't be expressed with the built-in annotations. For example, a condition that checks the environment (dev vs prod) based on a custom property.

CustomCondition.javaJAVA
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.example.billing.starter;

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

public class OnProductionEnvironmentCondition implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        String env = context.getEnvironment().getProperty("billing.environment");
        return "production".equalsIgnoreCase(env);
    }
}
Output
Custom condition that matches only when billing.environment is 'production'.
⚠ Custom Conditions Are Slow
📊 Production Insight
Document the ordering dependencies of your starter clearly. If your starter requires another starter to be loaded first, mention it in the README and add a startup warning if the dependency is missing.
🎯 Key Takeaway
Use @AutoConfigureBefore/After to control ordering. Use @ConditionalOnBean for cross-starter dependencies. Custom conditions are a last resort.
● Production incidentPOST-MORTEMseverity: high

The Case of the Vanishing DataSource

Symptom
After adding a new internal starter, all database writes started failing with read-only errors. No exception logs — just silent failures.
Assumption
The starter was "just a library" and wouldn't affect existing beans. The team assumed @ConditionalOnMissingBean would protect them.
Root cause
The starter defined a DataSource bean without @ConditionalOnMissingBean, and the auto-configuration order made it load after the primary DataSource, overriding it.
Fix
Added @ConditionalOnMissingBean to the DataSource definition and set @AutoConfigureBefore(DataSourceAutoConfiguration.class) to ensure proper ordering.
Key lesson
  • Always use @ConditionalOnMissingBean for beans users might already define.
  • Specify auto-configuration ordering with @AutoConfigureBefore or @AutoConfigureAfter.
  • Test starter behavior in an application that already defines the same beans.
Production debug guideStep-by-step guide to diagnose starter problems4 entries
Symptom · 01
Starter beans are not created
Fix
Enable debug logging for your starter package and check the autoconfigure report via /actuator/conditions. Look for unmatched conditionals.
Symptom · 02
Bean duplication error
Fix
Check if the user accidentally included both starter and autoconfigure module. Verify your starter uses @ConditionalOnMissingBean.
Symptom · 03
Starter works in dev but not in production
Fix
Compare classpaths. Production may have different versions of dependencies or missing transitive deps. Use 'mvn dependency:tree' on both environments.
Symptom · 04
Property binding fails
Fix
Ensure the user uses kebab-case in YAML. Check that @ConfigurationProperties prefix matches exactly. Verify the spring-configuration-metadata.json is present.
★ Quick Debug Cheat Sheet for Custom StartersImmediate actions to diagnose common starter problems
No beans from starter
Immediate action
Check AutoConfiguration.imports file exists in JAR
Commands
jar -tf your-starter.jar | grep AutoConfiguration
curl -s http://localhost:8080/actuator/conditions | jq '.contexts.default.positiveMatches'
Fix now
Add missing imports file or correct the class name
Bean override not working+
Immediate action
Verify starter uses @ConditionalOnMissingBean
Commands
grep -r 'ConditionalOnMissingBean' target/classes/
Check application context for duplicate beans: curl /actuator/beans | jq '.contexts.default.beans'
Fix now
Add @ConditionalOnMissingBean to starter's bean method
Property not recognized+
Immediate action
Check property prefix and kebab-case
Commands
grep -r 'ConfigurationProperties' target/classes/
curl -s http://localhost:8080/actuator/env | jq '.propertySources[].properties | keys'
Fix now
Correct property name in application.yml or add @EnableConfigurationProperties
Feature@ConditionalOnClass@ConditionalOnProperty@ConditionalOnMissingBean
PurposeCheck library presence on classpathCheck property value in environmentCheck if bean of type doesn't exist
Evaluation timingBefore bean creationBefore bean creationAfter other beans are registered
Common use caseEnable feature only if dependency existsFeature toggle via configurationAllow user to override default bean
Performance impactLow (classpath scan)Low (property lookup)Medium (bean lookup in context)
⚙ Quick Reference
8 commands from this guide
FileCommand / CodePurpose
BillingAutoConfiguration.java@AutoConfigurationWhat is a Spring Boot Starter?
BillingProperties.java@ConfigurationProperties(prefix = "billing")What the Official Docs Won't Tell You
AutoConfiguration.importscom.example.billing.starter.BillingAutoConfigurationRegistering Auto-Configuration
ConditionalBillingAutoConfiguration.java@AutoConfigurationConditional Annotations Deep Dive
pom.xml (starter module)Structuring Your Starter Project
BillingAutoConfigurationTest.javaclass BillingAutoConfigurationTest {Testing Your Custom Starter
application.yml (debug config)logging:Production Debugging and Monitoring
CustomCondition.javapublic class OnProductionEnvironmentCondition implements Condition {Advanced Techniques

Key takeaways

1
A custom Spring Boot starter bundles auto-configuration, dependencies, and property defaults into a reusable JAR.
2
Use @AutoConfiguration, @ConditionalOnClass, @ConditionalOnProperty, and @ConditionalOnMissingBean to make your starter smart and optional.
3
Register your auto-configuration class in AutoConfiguration.imports file. Test with ApplicationContextRunner and debug with Actuator's conditions endpoint.
4
Structure your starter into API, autoconfigure, and starter modules for maximum flexibility.
INTERVIEW PREP · PRACTICE MODE

Interview Questions on This Topic

Q01SENIOR
Explain how Spring Boot discovers auto-configuration classes and what fi...
Q02SENIOR
How would you design a starter that only activates in a specific environ...
Q03SENIOR
What happens if two starters both define a bean of the same type without...
Q01 of 03SENIOR

Explain how Spring Boot discovers auto-configuration classes and what file is used in Spring Boot 3.x.

ANSWER
Spring Boot 3.x uses the file META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. Each line contains a fully qualified class name of an auto-configuration class. Spring Boot reads this file at startup and processes the classes in order, applying conditional annotations to decide which ones to load.
FAQ · 4 QUESTIONS

Frequently Asked Questions

01
What is the difference between @ConditionalOnClass and @ConditionalOnBean?
02
Can I create a starter that works with both Spring Boot 2.x and 3.x?
03
How do I override a bean from a starter in my application?
04
What should I do if my starter's auto-configuration is not being applied?
N
Naren Founder & Principal Engineer

20+ years shipping production Java in banking & fintech. Notes here come from systems that actually shipped.

Follow
Verified
production tested
July 15, 2026
last updated
2,398
articles · all by Naren
🔥

That's Spring Boot. Mark it forged?

5 min read · try the examples if you haven't

Previous
Exclude Auto-Configuration Classes in Spring Boot Tests
69 / 121 · Spring Boot
Next
Spring Boot Auto-Configuration Report: Understanding What Was Configured