Brug af @Autowired i abstrakte klasser

1. Introduktion

I denne hurtige vejledning forklarer vi, hvordan du bruger @Autowired kommentar i abstrakte klasser.

Vi ansøger @Autowired til en abstrakt klasse og fokusere på de vigtige punkter, som vi skal tage i betragtning.

2. Setterinjektion

Vi kan bruge @Autowired på en setter metode:

offentlig abstrakt klasse BallService {privat LogRepository logRepository; @Autowired offentlig endelig ugyldighed setLogRepository (LogRepository logRepository) {this.logRepository = logRepository; }}

Når vi bruger @Autowired på en setter-metode, skal vi bruge det endelig nøgleord, så underklassen ikke kan tilsidesætte setter-metoden. Ellers fungerer kommentaren ikke, som vi forventer.

3. Konstruktørinjektion

Vi kan ikke bruge det @Autowired på en konstruktør af en abstrakt klasse.

Foråret vurderer ikke @Autowired kommentar til en konstruktør af en abstrakt klasse. Underklassen skal give de nødvendige argumenter til super konstruktør.

I stedet skal vi bruge @Autowired på konstruktøren af ​​underklassen:

offentlig abstrakt klasse BallService {privat RuleRepository ruleRepository; public BallService (RuleRepository ruleRepository) {this.ruleRepository = ruleRepository; }}
@Komponent offentlig klasse BasketballService udvider BallService {@Autowired offentlig BasketballService (RuleRepository ruleRepository) {super (ruleRepository); }}

4. Snydeark

Lad os bare afslutte et par regler, vi skal huske.

Først, en abstrakt klasse er ikke komponentscannet da det ikke kan instantieres uden en konkret underklasse.

Sekund, setterinjektion er mulig i en abstrakt klasse, men det er risikabelt, hvis vi ikke bruger endelig nøgleord til setter-metoden. Applikationen er muligvis ikke stabil, hvis en underklasse tilsidesætter setter-metoden.

For det tredje, da Spring ikke understøtter konstruktion af injektion i en abstrakt klasse, vi bør generelt lade de konkrete underklasser give konstruktørargumenterne. Det betyder at vi er nødt til at stole på konstruktionsinjektion i konkrete underklasser.

Og endelig er det en god tommelfingerregel at bruge konstruktørinjektion til krævede afhængigheder og setterinjektion til valgfri afhængigheder. Som vi kan se med nogle af nuancerne med abstrakte klasser, konstruktørinjektion er mere gunstig her generelt.

Så virkelig kan vi sige det en konkret underklasse styrer, hvordan dens abstrakte forælder får sine afhængigheder. Foråret gør injektionen så længe Spring trækker underklassen op.

5. Konklusion

I denne artikel øvede vi os i at bruge @Autowired inden for en abstrakt klasse og forklarede nogle få, men vigtige nøglepunkter.

Kildekoden til denne vejledning findes som normalt i Github-projektet.