Bruke @Autowired i abstrakte klasser

1. Introduksjon

I denne raske opplæringen forklarer vi hvordan du bruker @Autowired kommentar i abstrakte klasser.

Vi søker @Autowired til en abstrakt klasse, og fokuser på de viktige punktene som vi bør ta hensyn til.

2. Setter Injection

Vi kan bruke @Autowired på en settermetode:

offentlig abstrakt klasse BallService {private LogRepository logRepository; @Autowired public final void setLogRepository (LogRepository logRepository) {this.logRepository = logRepository; }}

Når vi bruker @Autowired på en settermetode, bør vi bruke de endelig nøkkelord, slik at underklassen ikke kan overstyre settermetoden. Ellers fungerer ikke kommentaren som vi forventer.

3. Konstruktørinjeksjon

Vi kan ikke bruke @Autowired på en konstruktør av en abstrakt klasse.

Våren vurderer ikke @Autowired kommentar på en konstruktør av en abstrakt klasse. Underklassen skal gi de nødvendige argumentene til super konstruktør.

I stedet bør vi bruke @Autowired på konstruktøren av underklassen:

offentlig abstrakt klasse BallService {private RuleRepository ruleRepository; public BallService (RuleRepository ruleRepository) {this.ruleRepository = ruleRepository; }}
@Component public class BasketballService utvider BallService {@Autowired public BasketballService (RuleRepository ruleRepository) {super (ruleRepository); }}

4. Jukseark

La oss bare avslutte med noen få regler å huske.

Først, en abstrakt klasse er ikke komponentskannet siden det ikke kan instantieres uten en konkret underklasse.

Sekund, setterinjeksjon er mulig i en abstrakt klasse, men det er risikabelt hvis vi ikke bruker endelig nøkkelord for settermetoden. Det kan hende at applikasjonen ikke er stabil hvis en underklasse overstyrer settermetoden.

For det tredje, da våren ikke støtter konstruktørinjeksjon i en abstrakt klasse, vi bør generelt la de konkrete underklassene gi konstruktørargumentene. Dette betyr at vi må stole på konstruksjonens injeksjon i betongunderklasser.

Og til slutt, å bruke konstruktørinjeksjon for nødvendige avhengigheter og setterinjeksjon for valgfrie avhengigheter er en god tommelfingerregel. Som vi kan se med noen av nyansene med abstrakte klasser, konstruksjonsinjeksjon er gunstigere her generelt.

Så egentlig kan vi si det en konkret underklasse styrer hvordan den abstrakte forelderen får sine avhengigheter. Våren vil gjøre injeksjonen så lenge Spring kobler til underklassen.

5. Konklusjon

I denne artikkelen øvde vi oss på å bruke @Autowired innenfor en abstrakt klasse og forklarte noen få, men viktige hovedpunkter.

Kildekoden til denne veiledningen finner du som vanlig i Github-prosjektet.


$config[zx-auto] not found$config[zx-overlay] not found