Starterek
dependency management, starter roles, custom starters
Starterek
1. Definíció
A Spring Boot Starter egy speciális Maven/Gradle dependency, amely összefogja az egy adott technológiához szükséges összes függőséget egyetlen, jól tesztelt csomagba. A starter neve konvenció szerint spring-boot-starter-* formátumú (pl. spring-boot-starter-web, spring-boot-starter-data-jpa).
A starter koncepció lényege az opinioned dependency management: ahelyett, hogy a fejlesztő egyenként keresi meg a kompatibilis library verziókat, a starter egy kurátor által összegyűjtött, tesztelt dependency halmazt ad. A starter önmagában nem tartalmaz forráskódot — kizárólag egy pom.xml (vagy build.gradle), amely tranzitív függőségeket húz be.
<!-- Egyetlen dependency → 20+ tranzitív library -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2. Alapfogalmak
Starter típusok
| Típus | Példa | Tartalom |
|---|---|---|
| Application starter | spring-boot-starter-web |
Tomcat + Spring MVC + Jackson |
| Technical starter | spring-boot-starter-actuator |
Monitoring + health check |
| Production starter | spring-boot-starter-logging |
Logback + SLF4J bridge-ek |
| Test starter | spring-boot-starter-test |
JUnit 5 + Mockito + AssertJ |
| Parent POM | spring-boot-starter-parent |
Plugin management + property-k |
BOM (Bill of Materials)
A spring-boot-dependencies BOM definiálja az összes Spring Boot által menedzselt library verzióját:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>3.3.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Tranzitív dependency-k
A starter nem tartalmaz kódot, csak egy pom.xml-t tranzitív dependency-kkel:
spring-boot-starter-web→spring-web,spring-webmvc,spring-boot-starter-tomcat,jackson-databindspring-boot-starter-data-jpa→spring-data-jpa,hibernate-core,spring-boot-starter-jdbc
Starter parent
A spring-boot-starter-parent opcionális szülő POM:
- Definiálja a Java verziót, encoding-ot, resource filtering-ot
- Plugin konfigurációk (maven-compiler-plugin, spring-boot-maven-plugin)
- Property-k felülírhatók:
<java.version>21</java.version>
3. Gyakorlati használat
Starter kiválasztás
<!-- Web alkalmazás -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- JPA adatbázis kezelés -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- Security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- Test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
Embedded szerver csere
Alapértelmezés: Tomcat. Cseréld Jetty-re:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
BOM használat parent nélkül
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>3.3.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
4. Kód példák
Custom starter struktúra
Egy saját starter két modulból áll:
my-spring-boot-starter/
├── my-spring-boot-autoconfigure/
│ ├── src/main/java/
│ │ └── com/example/autoconfigure/
│ │ ├── MyAutoConfiguration.java
│ │ └── MyProperties.java
│ └── src/main/resources/
│ └── META-INF/spring/
│ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
└── my-spring-boot-starter/
└── pom.xml ← csak dependency-k, nincs kód
Auto-configure modul
@AutoConfiguration
@ConditionalOnClass(MyService.class)
@EnableConfigurationProperties(MyProperties.class)
public class MyAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public MyService myService(MyProperties properties) {
return new MyService(properties.getPrefix(), properties.getSuffix());
}
}
Properties osztály
@ConfigurationProperties(prefix = "my.service")
public class MyProperties {
private String prefix = "default-prefix";
private String suffix = "default-suffix";
// getterek és setterek
public String getPrefix() { return prefix; }
public void setPrefix(String prefix) { this.prefix = prefix; }
public String getSuffix() { return suffix; }
public void setSuffix(String suffix) { this.suffix = suffix; }
}
Starter POM
<?xml version="1.0" encoding="UTF-8"?>
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>my-spring-boot-starter</artifactId>
<version>1.0.0</version>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>my-spring-boot-autoconfigure</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>
.imports regisztráció
com.example.autoconfigure.MyAutoConfiguration
5. Trade-offok
| Előny | Hátrány |
|---|---|
| Gyors projekt indítás | Felesleges dependency-k bekerülhetnek |
| Tesztelt verzió-kompatibilitás | "Black box" — nem mindig látod, mit húz be |
| Egyetlen dependency ≈ teljes stack | Verzió ütközés más BOM-okkal |
| Konvenció-alapú | Custom starter karbantartás költséges |
| Auto-configuration integráció | Debug nehézkes tranzitív dependency-knél |
Starter vs manuális dependency management
- Starter: gyors, konvencionális, de kevesebb kontroll
- Manuális: teljes kontroll, de verziók kézi karbantartása
- Hibrid: starter + exclusion + explicit felülírás
Micro-service vs monolith
- Micro-service: minimális starter-ek (kevesebb classpath méret)
- Monolith: több starter, de figyelni a dependency fa méretét
6. Gyakori hibák
❌ Szükségtelen starter-ek
<!-- HIBA: mindent behúzunk -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<!-- Web és Webflux egyszerre → váratlan viselkedés -->
❌ Verzió explicit megadása starter-nél
<!-- HIBA: ne adj verziót, ha van parent vagy BOM! -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>3.2.0</version> <!-- ← NE! -->
</dependency>
✅ Helyes: BOM kezeli a verziót
<!-- A parent vagy BOM biztosítja a kompatibilis verziót -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- nincs <version> -->
</dependency>
❌ Custom starter elnevezési hiba
<!-- HIBA: spring-boot-starter-* név kizárólag hivatalos starter-eknek -->
<artifactId>spring-boot-starter-mycompany</artifactId>
<!-- HELYES: saját prefix -->
<artifactId>mycompany-spring-boot-starter</artifactId>
❌ Exclusion hiánya szerver cserénél
Ha Jetty-re váltasz, de nem excludálod a Tomcat-et → mindkét szerver a classpath-on → indulási hiba.
7. Mélyebb összefüggések
Starter és auto-configuration kapcsolata
A starter dependency-ket húz be, az auto-configuration pedig a classpath alapján konfigurálja a bean-eket:
- Starter behúzza a
spring-web,spring-webmvc,tomcat-embeddependency-ket WebMvcAutoConfigurationa classpath-on lévőDispatcherServlet.class-t észleli (@ConditionalOnClass)- Auto-config létrehozza a web konfigurációs bean-eket
Dependency fa ellenőrzés
# Maven dependency fa
mvn dependency:tree
# Gradle dependency fa
gradle dependencies --configuration runtimeClasspath
# Egy konkrét starter tranzitív dependency-i
mvn dependency:tree -Dincludes=org.springframework.boot:spring-boot-starter-web
Verzió felülírás property-vel
<properties>
<!-- A BOM definiálja, de felülírhatod: -->
<jackson.version>2.17.0</jackson.version>
<hibernate.version>6.5.0.Final</hibernate.version>
<tomcat.version>10.1.24</tomcat.version>
</properties>
Custom starter tesztelés
@SpringBootTest
class MyAutoConfigurationTest {
@Test
void autoConfigurationCreatesBean() {
new ApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(MyAutoConfiguration.class))
.withPropertyValues("my.service.prefix=test")
.run(context -> {
assertThat(context).hasSingleBean(MyService.class);
assertThat(context.getBean(MyService.class).getPrefix())
.isEqualTo("test");
});
}
@Test
void backOffWhenUserDefinesBean() {
new ApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(MyAutoConfiguration.class))
.withUserConfiguration(CustomConfig.class)
.run(context -> {
assertThat(context).hasSingleBean(MyService.class);
assertThat(context.getBean(MyService.class).getPrefix())
.isEqualTo("custom");
});
}
@Configuration
static class CustomConfig {
@Bean
public MyService myService() {
return new MyService("custom", "custom");
}
}
}
8. Interjúkérdések
Mi a Spring Boot starter és miért hasznos? Összefogja az egy technológiához szükséges dependency-ket egyetlen csomagba. Tesztelt verzió-kompatibilitást és opinioned default-okat biztosít.
Mi a különbség a starter és az auto-configuration között? A starter dependency-ket húz be (POM), az auto-configuration bean-eket konfigurál (@AutoConfiguration + @Conditional*). A kettő együtt ad teljes feature-t.
Hogyan cserélsz embedded szervert? Exclude a default Tomcat starter-t, és add hozzá a kívánt szerver starter-t (jetty, undertow, netty).
Mi a BOM és hogyan használod parent nélkül? Bill of Materials — dependency verziók központi definiálása.
<scope>import</scope>a<dependencyManagement>blokkban.Hogyan írsz custom startert? Két modul: autoconfigure (kód + @AutoConfiguration + .imports) és starter (csak dependency POM). Elnevezés:
mycompany-spring-boot-starter.Hogyan vizsgálod a tranzitív dependency-ket?
mvn dependency:treevagygradle dependencies. Fontos a conflict-ok és duplikálások felderítése.Miért ne adj verziót a starter dependency-hez? Mert a parent/BOM menedzseli. Explicit verzió felülírja a menedzselt verziót, ami inkompatibilitást okozhat.
9. Szószedet
| Fogalom | Jelentés |
|---|---|
| Starter | Dependency csomag, amely összefogja egy adott feature library-jeit |
| BOM | Bill of Materials — verzió-koordináló POM |
| Tranzitív dependency | Közvetett függőség, amit egy másik dependency húz be |
| Parent POM | Szülő POM, amely plugin és property management-et biztosít |
| Exclusion | Egy tranzitív dependency kizárása |
| Auto-configuration | Classpath-alapú bean konfiguráció |
| ApplicationContextRunner | Spring Boot teszt segédosztály auto-config teszteléshez |
| spring-boot-dependencies | A központi BOM összes menedzselt verzióval |
| Opinioned defaults | A Spring Boot által választott default beállítások |
| Custom starter | Saját fejlesztésű starter két modulból (autoconfigure + starter) |
10. Gyorsreferencia
<!-- Leggyakoribb starter-ek -->
spring-boot-starter-web <!-- Tomcat + Spring MVC -->
spring-boot-starter-webflux <!-- Netty + WebFlux -->
spring-boot-starter-data-jpa <!-- Hibernate + Spring Data JPA -->
spring-boot-starter-security <!-- Spring Security -->
spring-boot-starter-test <!-- JUnit 5 + Mockito + AssertJ -->
spring-boot-starter-actuator <!-- Monitoring + health check -->
spring-boot-starter-validation <!-- Bean Validation (Hibernate Validator) -->
spring-boot-starter-cache <!-- Cache abstraction -->
spring-boot-starter-mail <!-- JavaMail -->
spring-boot-starter-amqp <!-- RabbitMQ -->
# Dependency fa vizsgálat
mvn dependency:tree
gradle dependencies
# Verzió felülírás
# pom.xml: <jackson.version>2.17.0</jackson.version>
# gradle: ext['jackson.version'] = '2.17.0'
Custom starter elnevezés:
✅ mycompany-spring-boot-starter
❌ spring-boot-starter-mycompany (fenntartott)
Custom starter struktúra:
mycompany-spring-boot-starter/ ← csak dependency POM
mycompany-spring-boot-autoconfigure/ ← kód + @AutoConfiguration
Starter ≠ Auto-configuration:
Starter = dependency-k (POM)
Auto-config = bean-ek (Java kód + @Conditional*)
🎮 Játékok
10 kérdés