Custom Spring Boot 3 Starter does not create ConfigurationProperties beans
Master System Design with Codemia
Enhance your system design skills with over 120 practice problems, detailed solutions, and hands-on exercises.
Introduction
A custom Spring Boot 3 starter does not create @ConfigurationProperties beans automatically just because the class exists on the classpath. In Boot 3, your starter has to register its auto-configuration correctly, and that auto-configuration must either enable the properties type or expose a bean that uses configuration-property binding.
What Usually Goes Wrong
There are two common causes.
First, the properties class is annotated with @ConfigurationProperties, but nothing tells Spring Boot to register it. @ConfigurationProperties describes binding metadata; it is not itself a bean-registration mechanism.
Second, the starter still uses the old spring.factories registration pattern from older Boot versions. Spring Boot 3 expects auto-configurations to be listed in META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports.
If either piece is missing, the application starts, the starter JAR is present, but no configuration properties bean appears.
A Correct Spring Boot 3 Starter Layout
Start with a properties class:
Then create an auto-configuration class and explicitly enable that properties type:
Finally, register the auto-configuration class in:
with this content:
That file is what allows Spring Boot 3 to discover the starter’s auto-configuration.
How the Application Uses It
Once the starter is on the classpath, the consuming application can configure it with normal externalized properties.
When Boot processes auto-configuration, it registers DemoClientProperties, binds values from configuration, and injects that bean into demoClient.
Alternative Pattern: @ConfigurationPropertiesScan
@ConfigurationPropertiesScan is useful in an application module, but it is usually not the right fix for a starter. A starter should be self-contained and not require the consuming application to scan the starter package explicitly.
That is why @EnableConfigurationProperties inside the starter auto-configuration is the more reliable approach. It makes the starter work when present, which is exactly what auto-configuration is supposed to do.
Testing the Starter
A good starter should include an auto-configuration test so you can prove the properties bean exists.
That test catches registration mistakes early, which is especially useful when refactoring starter packaging.
Common Pitfalls
The biggest pitfall is expecting @ConfigurationProperties alone to create a bean. It does not. You still need registration through @EnableConfigurationProperties, scanning, or an explicit bean method.
Another mistake is using spring.factories as if Boot 3 still discovered auto-configuration from there. For Boot 3 starters, use AutoConfiguration.imports.
Developers also put the properties class in the starter but forget that component scanning usually starts from the application package, not from arbitrary dependency packages. Relying on scan side effects is brittle.
Finally, do not skip tests. A starter that “looks right” in code can still fail quietly if its metadata files are misplaced or not packaged into the JAR correctly.
Summary
- '
@ConfigurationPropertiesdescribes binding; it does not automatically register a bean in a custom starter.' - In Spring Boot 3, register starter auto-configuration with
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. - Use
@AutoConfigurationplus@EnableConfigurationPropertiesin the starter to expose the properties bean reliably. - Do not depend on the consuming application to scan starter packages.
- Add an
ApplicationContextRunnertest so packaging or registration mistakes are caught immediately.

