Clean • Professional
Spring Boot’s strength comes from starters and auto-configuration, which allow developers to plug in functionality automatically without manual wiring. Creating custom starters enables reusable, modular, and shareable components for applications or libraries.
Custom starters and auto-configuration help you:
A starter is a convenience dependency that bundles:
Examples:
| Starter | Purpose |
|---|---|
spring-boot-starter-web | Spring MVC, Tomcat, Jackson |
spring-boot-starter-data-jpa | JPA, Hibernate, database drivers |

Starters do not contain application logic; they only include dependencies and auto-configuration classes. They make projects plug-and-play.
Auto-configuration automatically creates and registers beans in the Spring context based on classpath, application properties, and conditions.

Example:
@Configuration
@ConditionalOnClass(DataSource.class)
publicclassDataSourceAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public DataSourcedataSource() {
returnnewHikariDataSource();
}
}
Mechanism:
SpringFactoriesLoader reads metadata (spring.factories in Boot ≤2.x or AutoConfiguration.imports in Boot 3.x).BeanDefinitionRegistry.Auto-configuration allows apps to be “production-ready” with minimal setup.
A custom starter typically contains:
1. Starter Module – Contains pom.xml or Gradle dependencies:
<dependency>
<groupId>com.example</groupId>
<artifactId>my-library</artifactId>
<version>1.0.0</version>
</dependency>
2. Auto-Configuration Module – Contains @Configuration classes with conditional bean registration:
@Configuration
@ConditionalOnClass(MyService.class)
@EnableConfigurationProperties(MyServiceProperties.class)
publicclassMyServiceAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public MyServicemyService(MyServiceProperties props) {
returnnewMyService(props.getUrl());
}
}
3. Register Auto-Configuration
META-INF/spring.factoriesorg.springframework.boot.autoconfigure.EnableAutoConfiguration=\\
com.example.autoconfig.MyServiceAutoConfiguration
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.importscom.example.autoconfig.MyServiceAutoConfiguration
4. Optional Properties - Allows external configuration:
@ConfigurationProperties(prefix="my.service")
publicclassMyServiceProperties {
privateStringurl="<https://default.com>";
public StringgetUrl() {return url; }
publicvoidsetUrl(String url) {this.url = url; }
}
MyService class with configurable properties.@Configuration + conditional annotations.@ConfigurationProperties for external configuration.spring.factories or AutoConfiguration.imports.Example Test App:
@SpringBootApplication
publicclassTestApplication {
publicstaticvoidmain(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
@Autowired
private MyService myService;
@PostConstruct
publicvoidtest() {
System.out.println(myService.getUrl());
}
}
Expected output if overridden:
<https://custom-app.com>
Spring Boot uses conditional annotations to make auto-configuration safe and opt-in:
| Annotation | Purpose |
|---|---|
@ConditionalOnClass | Only configure if a class exists on classpath |
@ConditionalOnMissingBean | Only configure if no bean of this type exists |
@ConditionalOnProperty | Only configure if a property exists / matches value |
@ConditionalOnBean | Only configure if another bean exists |
Conditional checks ensure your starter is non-intrusive.
application.properties or application.yml.SpringApplication.run() triggers auto-configuration loading.ApplicationContext without manual wiring.Flow Diagram Conceptually:
Project includes starter
↓
SpringApplication.run()
↓
SpringFactoriesLoader reads metadata
↓
AutoConfigurationImportSelector selects classes
↓
Conditional checks applied
↓
BeanDefinitions registered
↓
Beans instantiated (whenrequired)
application.properties:
my.service.url=https://api.example.com
Spring Boot App:
@SpringBootApplication
publicclassApp {
publicstaticvoidmain(String[] args) {
SpringApplication.run(App.class, args);
}
@Autowired
private MyService myService;
@PostConstruct
publicvoidcallService() {
myService.call();
}
}
Starter handles all wiring, configuration, and conditions automatically—no @Bean required in the app.
Custom starters and auto-configuration are powerful tools in Spring Boot. They enable: