Custom auto-configuration helps your Spring Boot app set up beans automatically without manual setup. It saves time and keeps your code clean.
Custom auto-configuration in Spring Boot
@Configuration @ConditionalOnClass(SomeClass.class) @ConditionalOnProperty(prefix = "my.feature", name = "enabled", havingValue = "true", matchIfMissing = true) public class MyAutoConfiguration { @Bean public MyService myService() { return new MyService(); } }
@Configuration marks the class as a source of bean definitions.
@ConditionalOnClass creates beans only if a class is on the classpath.
@Configuration @ConditionalOnClass(DataSource.class) public class DataSourceAutoConfiguration { @Bean public DataSource dataSource() { return new HikariDataSource(); } }
feature.enabled=true is set.@Configuration @ConditionalOnProperty(prefix = "feature", name = "enabled", havingValue = "true") public class FeatureAutoConfiguration { @Bean public FeatureService featureService() { return new FeatureService(); } }
@Configuration @ConditionalOnMissingBean(MyService.class) public class MyServiceAutoConfiguration { @Bean public MyService myService() { return new MyService(); } }
This example shows a custom auto-configuration class that creates a MyService bean if the class is present and a property myapp.service.enabled is true or missing. The main app fetches the bean and prints a greeting.
package com.example.autoconfig; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @Configuration @ConditionalOnClass(MyService.class) @ConditionalOnProperty(prefix = "myapp.service", name = "enabled", havingValue = "true", matchIfMissing = true) public class MyServiceAutoConfiguration { @Bean @ConditionalOnMissingBean public MyService myService() { return new MyService(); } } // Simple service class class MyService { public String greet() { return "Hello from MyService!"; } } // Main application to test auto-configuration package com.example.demo; import com.example.autoconfig.MyService; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationContext; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { ApplicationContext ctx = SpringApplication.run(DemoApplication.class, args); MyService service = ctx.getBean(MyService.class); System.out.println(service.greet()); } }
Always use @ConditionalOnMissingBean to allow users to override your beans.
Put your auto-configuration classes in spring.factories or use the new spring.autoconfigure file for Spring Boot 3+.
Test your auto-configuration by enabling/disabling properties and checking bean presence.
Custom auto-configuration creates beans automatically based on conditions.
Use conditions like class presence and properties to control bean creation.
It helps make reusable, easy-to-configure Spring Boot modules.
Practice
Solution
Step 1: Understand auto-configuration concept
Custom auto-configuration automatically creates beans when certain conditions are met, reducing manual setup.Step 2: Compare options with purpose
Only To automatically create beans based on specific conditions describes automatic bean creation based on conditions, which matches the purpose.Final Answer:
To automatically create beans based on specific conditions -> Option AQuick Check:
Auto-configuration = automatic bean creation [OK]
- Confusing auto-configuration with manual bean registration
- Thinking it disables default configurations
- Mixing it with database query writing
Solution
Step 1: Identify annotation for configuration classes
@Configuration marks a class as a source of bean definitions, suitable for auto-configuration classes.Step 2: Exclude other annotations
@Component is generic, @EnableAutoConfiguration is used on main app class, @SpringBootApplication is a composite annotation.Final Answer:
@Configuration -> Option AQuick Check:
Auto-config class needs @Configuration [OK]
- Using @Component instead of @Configuration
- Confusing @EnableAutoConfiguration with auto-config class annotation
- Using @SpringBootApplication on config classes
com.example.MyService is on the classpath and property my.feature.enabled=true?
@Configuration
@ConditionalOnClass(name = "com.example.MyService")
@ConditionalOnProperty(prefix = "my.feature", name = "enabled", havingValue = "true")
public class MyFeatureAutoConfiguration {
@Bean
public String featureBean() {
return "Feature Enabled";
}
}Solution
Step 1: Check conditions for bean creation
Bean is created only if class com.example.MyService exists and property my.feature.enabled=true.Step 2: Given conditions are met
Since both conditions are true, the featureBean method creates a bean with value "Feature Enabled".Final Answer:
A bean named featureBean with value "Feature Enabled" will be created -> Option BQuick Check:
Conditions met = bean created [OK]
- Ignoring @ConditionalOnProperty and assuming bean always created
- Confusing bean name with class name
- Expecting exceptions when conditions are met
@Configuration
@ConditionalOnClass(name = "com.example.Service")
public class ServiceAutoConfiguration {
@Bean
public Service service() {
return new Service();
}
@Bean
public Service service() {
return new Service();
}
}Solution
Step 1: Check bean method definitions
Two methods named service() exist, both annotated with @Bean, causing duplicate bean names.Step 2: Understand Spring bean naming rules
Bean names must be unique; duplicate method names cause compilation or context startup errors.Final Answer:
Duplicate bean method names causing a compilation error -> Option DQuick Check:
Duplicate @Bean methods = error [OK]
- Ignoring duplicate method names
- Thinking missing @ConditionalOnProperty is an error here
- Assuming missing import causes this error
app.feature.enabled is true. Which combination of annotations should you use on your configuration class and bean method?
A) @Configuration on class, @ConditionalOnMissingBean and @ConditionalOnProperty on bean method
B) @Component on class, @ConditionalOnBean on bean method
C) @Configuration on class, @ConditionalOnClass on bean method
D) @EnableAutoConfiguration on class, no conditions on bean methodSolution
Step 1: Identify class-level annotation for config
@Configuration is correct to mark a class as configuration for auto-configuration.Step 2: Choose bean method conditions
@ConditionalOnMissingBean ensures no existing bean of the type exists; @ConditionalOnProperty checks the property is true.Step 3: Exclude incorrect options
@Component is generic, @ConditionalOnBean requires existing bean, @ConditionalOnClass checks class presence, not bean existence, @EnableAutoConfiguration is for main app class.Final Answer:
@Configuration on class, @ConditionalOnMissingBean and @ConditionalOnProperty on bean method -> Option CQuick Check:
Missing bean + property conditions = @Configuration on class, @ConditionalOnMissingBean and @ConditionalOnProperty on bean method [OK]
- Using @ConditionalOnBean instead of @ConditionalOnMissingBean
- Putting conditions on class instead of bean method
- Confusing @EnableAutoConfiguration with config class annotation
Ready to prove it?
Pass the test and this pattern moves unknown
