Utilizzo di @Autowired nelle classi astratte

1. Introduzione

In questo rapido tutorial, spiegheremo come utilizzare l' annotazione @Autowired nelle classi astratte.

Applicheremo @Autowired ad una classe astratta, e concentrarsi sui punti importanti che dovremmo prendere in considerazione.

2. Setter Injection

Possiamo usare @Autowired su un metodo setter:

public abstract class BallService { private LogRepository logRepository; @Autowired public final void setLogRepository(LogRepository logRepository) { this.logRepository = logRepository; } }

Quando usiamo @Autowired su un metodo setter, dovremmo usare la parola chiave final , in modo che la sottoclasse non possa sovrascrivere il metodo setter . In caso contrario, l'annotazione non funzionerà come previsto.

3. Iniezione del costruttore

Non possiamo usare @Autowired su un costruttore di una classe astratta.

Spring non valuta l' annotazione @Autowired su un costruttore di una classe astratta. La sottoclasse dovrebbe fornire gli argomenti necessari al super costruttore.

Invece, dovremmo usare @Autowired nel costruttore della sottoclasse:

public abstract class BallService { private RuleRepository ruleRepository; public BallService(RuleRepository ruleRepository) { this.ruleRepository = ruleRepository; } }
@Component public class BasketballService extends BallService { @Autowired public BasketballService(RuleRepository ruleRepository) { super(ruleRepository); } }

4. Cheat Sheet

Concludiamo con alcune regole da ricordare.

Primo, una classe astratta non è sottoposta a scansione per componenti poiché non può essere istanziata senza una sottoclasse concreta.

In secondo luogo, l' iniezione di setter è possibile in una classe astratta , ma è rischioso se non usiamo la parola chiave final per il metodo setter. L'applicazione potrebbe non essere stabile se una sottoclasse sovrascrive il metodo setter.

Terzo, poiché Spring non supporta l'iniezione del costruttore in una classe astratta, dovremmo generalmente lasciare che le sottoclassi concrete forniscano gli argomenti del costruttore . Ciò significa che dobbiamo fare affidamento sull'iniezione del costruttore in sottoclassi concrete .

Infine, l'utilizzo dell'inserimento del costruttore per le dipendenze richieste e dell'inserimento del setter per le dipendenze opzionali è una buona regola pratica. Tuttavia, come possiamo vedere con alcune delle sfumature con le classi astratte, l' iniezione del costruttore è più favorevole qui in generale.

Quindi, possiamo davvero dire che una sottoclasse concreta governa il modo in cui il suo genitore astratto ottiene le sue dipendenze . Spring farà l'iniezione fintanto che Spring collega la sottoclasse.

5. conclusione

In questo articolo, ci siamo esercitati usando @Autowired all'interno di una classe astratta e abbiamo spiegato alcuni ma importanti punti chiave.

Il codice sorgente di questo tutorial può essere trovato nel progetto Github come al solito.