@Autowired gebruiken in abstracte klassen

1. Inleiding

In deze korte tutorial leggen we uit hoe je de @Autowired annotatie in abstracte klassen.

We zullen solliciteren @Autowired tot een abstracte klas, en concentreer je op de belangrijke punten waarmee we rekening moeten houden.

2. Setterinjectie

We kunnen gebruiken @Autowired op een setter-methode:

openbare abstracte klasse BallService {privé LogRepository logRepository; @Autowired openbare definitieve ongeldige setLogRepository (LogRepository logRepository) {this.logRepository = logRepository; }}

Wanneer we gebruiken @Autowired op een setter-methode zouden we moeten gebruiken de laatste trefwoord, zodat de subklasse de setter-methode niet kan overschrijven. Anders werkt de annotatie niet zoals verwacht.

3. Constructorinjectie

We kunnen niet gebruiken @Autowired op een constructor van een abstracte klasse.

De lente evalueert de @Autowired annotatie op een constructor van een abstracte klasse. De subklasse moet de nodige argumenten voor de super constructeur.

In plaats daarvan zouden we moeten gebruiken @Autowired op de constructor van de subklasse:

openbare abstracte klasse BallService {privé RuleRepository ruleRepository; openbare BallService (RuleRepository ruleRepository) {this.ruleRepository = ruleRepository; }}
@Component openbare klasse BasketballService breidt BallService uit {@Autowired openbare BasketballService (RuleRepository ruleRepository) {super (ruleRepository); }}

4. Spiekbriefje

Laten we afronden met een paar regels om te onthouden.

Eerste, een abstracte klasse wordt niet door componenten gescand omdat het niet kan worden geïnstantieerd zonder een concrete subklasse.

Tweede, setter injectie is mogelijk in een abstracte klasse, maar het is riskant als we de laatste trefwoord voor de setter-methode. De toepassing is mogelijk niet stabiel als een subklasse de setter-methode overschrijft.

Ten derde, omdat Spring geen constructor-injectie ondersteunt in een abstracte klasse, we moeten in het algemeen de concrete subklassen de constructorargumenten laten geven. Dit betekent dat we moeten vertrouwen op constructorinjectie in betonnen subklassen.

En tot slot is het gebruik van constructor-injectie voor vereiste afhankelijkheden en setter-injectie voor optionele afhankelijkheden een goede vuistregel. Zoals we echter kunnen zien met enkele nuances met abstracte klassen, constructor injectie is gunstiger hier in het algemeen.

Dus dat kunnen we echt zeggen een concrete subklasse bepaalt hoe zijn abstracte ouder zijn afhankelijkheden krijgt. De lente zal de injectie doen zolang Spring draden omhoog in de subklasse.

5. Conclusie

In dit artikel hebben we geoefend met @Autowired binnen een abstracte klas en legde een paar maar belangrijke kernpunten uit.

De broncode van deze tutorial is zoals gewoonlijk te vinden in het Github-project.