Spring Boot 4-microservices en REST-API's · Les

Constructorinjectie versus veldinjectie

Kies de juiste injectiestijl.

Les 2 van 413 stappen

Constructorinjectie versus veldinjectie is een gratis Spring Boot 4-microservices en REST-API's-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Spring Boot 4-microservices en REST-API's. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Spring Boot 4-microservices en REST-API's bevat in totaal 4 lessen.

Drie manieren om te injecteren

Spring kan afhankelijkheden op drie manieren injecteren: via de constructor, in velden of via setters. Ze werken allemaal, maar zijn niet allemaal even goed.

Het Spring-team en de community raden constructorinjectie sterk aan. In deze les wordt uitgelegd waarom.

Veldinjectie

Bij veldinjectie staat @Autowired rechtstreeks op een veld. Dat ziet er compact uit, maar verbergt de afhankelijkheid en maakt testen ingewikkelder.

@Service
public class OrderService {
    @Autowired
    private OrderRepository repo;
    @Autowired
    private PricingService pricing;
}

Constructorinjectie

Constructorinjectie declareert afhankelijkheden als constructorparameters. Spring levert ze aan bij het aanmaken van de bean. Velden kunnen final zijn, wat echte onveranderlijkheid aangeeft.

@Service
public class OrderService {
    private final OrderRepository repo;
    private final PricingService pricing;
    public OrderService(OrderRepository repo, PricingService pricing) {
        this.repo = repo;
        this.pricing = pricing;
    }
}

Geen @Autowired nodig

Sinds Spring 4.3 is @Autowired optioneel als een bean één constructor heeft. Zo blijven klassen met constructorinjectie overzichtelijk en zijn er weinig annotaties nodig.

@Service
public class OrderService {
    private final OrderRepository repo;
    // single constructor: no @Autowired required
    public OrderService(OrderRepository repo) {
        this.repo = repo;
    }
}

Onveranderlijkheid en final

Met constructorinjectie kan elke afhankelijkheid final zijn. Het object wordt één keer volledig geïnitialiseerd en verandert zijn samenwerkende onderdelen nooit, waardoor onbedoelde toewijzingen worden voorkomen en threadveiligheid wordt bevorderd.

Veldinjectie kan final niet gebruiken, waardoor het object in een gedeeltelijk opgebouwde toestand kan bestaan.

Testbaarheid zonder Spring

Een constructor maakt afhankelijkheden expliciet, zodat unit-tests het object rechtstreeks met mocks kunnen opbouwen — zonder Spring-context en zonder reflectie.

@Test
void placesOrder() {
    OrderRepository repo = mock(OrderRepository.class);
    PricingService pricing = mock(PricingService.class);
    OrderService svc = new OrderService(repo, pricing);
    // ... arrange and assert
}

Te veel afhankelijkheden herkennen

Een overvolle constructor is een zichtbaar codeprobleem. Als een klasse acht samenwerkende onderdelen nodig heeft, laat de lange parameterlijst duidelijk zien dat de klasse te veel doet. Veldinjectie verbergt dit en laat monolithische klassen ongemerkt groeien.

Circulaire afhankelijkheden vermijden

Constructorinjectie maakt circulaire afhankelijkheden bij het opstarten zichtbaar met een duidelijke foutmelding, omdat twee beans niet allebei als eerste kunnen worden aangemaakt. Veldinjectie kan de cyclus verbergen tot de uitvoering, wat tot subtiele fouten leidt.

Een fout tijdens het opstarten is het juiste moment om een ontwerpcirkel te ontdekken en op te lossen.

Setterinjectie

Setterinjectie is geschikt voor echt optionele afhankelijkheden die na het aanmaken kunnen veranderen. Het is zelden nodig; geef voor vereiste samenwerkende onderdelen de voorkeur aan constructorinjectie.

@Service
public class ReportService {
    private Formatter formatter = new PlainFormatter();
    @Autowired(required = false)
    public void setFormatter(Formatter formatter) {
        this.formatter = formatter;
    }
}

Minder boilerplate met Lombok

Als constructors uitgebreid aanvoelen, genereert Lombok’s @RequiredArgsConstructor er één op basis van alle final-velden. Zo krijg je de voordelen van constructorinjectie met minimale code.

@Service
@RequiredArgsConstructor
public class OrderService {
    private final OrderRepository repo;
    private final PricingService pricing;
}

Waarom deze aanbeveling blijft gelden

Constructorinjectie wint op elk gebied:

  • Onveranderlijke, volledig geïnitialiseerde objecten
  • Eenvoudige unit-tests zonder container
  • Circulaire afhankelijkheden en te veel afhankelijkheden worden zichtbaar
  • Tests hebben geen toegang nodig die alleen via reflectie werkt

Snelle controle

Test je begrip van injectiestijlen.

Samenvatting

Geef de voorkeur aan constructorinjectie.

  • Maakt final en onveranderlijke afhankelijkheden mogelijk
  • Voor één constructor is geen @Autowired nodig
  • Unit-tests zijn mogelijk zonder de Spring-context
  • Maakt circulaire afhankelijkheden en te grote klassen zichtbaar
  • Gebruik setters alleen voor optionele, veranderlijke samenwerkende onderdelen
Gratis beginnen

Leer Java met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
24
Lessen
93

Veelgestelde vragen

Is de les “Constructorinjectie versus veldinjectie” gratis?

Ja — de volledige tekst van “Constructorinjectie versus veldinjectie” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Spring Boot 4-microservices en REST-API's wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Spring Boot 4-microservices en REST-API's bevat in totaal 4 lessen.

Wat leer ik in “Constructorinjectie versus veldinjectie”?

Kies de juiste injectiestijl. Je oefent met Spring Boot 4-microservices en REST-API's door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Spring Boot 4-microservices en REST-API's te beginnen?

Ervaring vooraf is niet nodig. Spring Boot 4-microservices en REST-API's op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.

Hoe lang duurt de les “Constructorinjectie versus veldinjectie”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Spring Boot 4-microservices en REST-API's?

Ja. Elke les over Spring Boot 4-microservices en REST-API's bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. De Spring IoC-container
  2. Constructorinjectie versus veldinjectie
  3. Bean-scopes
  4. Lifecycle-callbacks
← Terug naar Spring Boot 4-microservices en REST-API's