Kezdő Olvasási idő: ~7 perc

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-webspring-web, spring-webmvc, spring-boot-starter-tomcat, jackson-databind
  • spring-boot-starter-data-jpaspring-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:

  1. Starter behúzza a spring-web, spring-webmvc, tomcat-embed dependency-ket
  2. WebMvcAutoConfiguration a classpath-on lévő DispatcherServlet.class-t észleli (@ConditionalOnClass)
  3. 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

  1. 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.

  2. 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.

  3. Hogyan cserélsz embedded szervert? Exclude a default Tomcat starter-t, és add hozzá a kívánt szerver starter-t (jetty, undertow, netty).

  4. 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.

  5. Hogyan írsz custom startert? Két modul: autoconfigure (kód + @AutoConfiguration + .imports) és starter (csak dependency POM). Elnevezés: mycompany-spring-boot-starter.

  6. Hogyan vizsgálod a tranzitív dependency-ket? mvn dependency:tree vagy gradle dependencies. Fontos a conflict-ok és duplikálások felderítése.

  7. 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