Perché non possiamo autowire campi statici in primavera?


96

Perché non possiamo autowire la variabile di istanza statica nel bean Spring. So che c'è un altro modo per raggiungere questo obiettivo, ma voglio solo sapere perché non possiamo farlo nel modo seguente.

per esempio

@Autowired
public static Test test;

puoi fare luce sul modo alternativo a cui ti riferisci.
Samshers

Puoi autowire attraverso il costruttore o usare @PostConstuct
gagarwa

Risposte:


69

Perché l'utilizzo di campi statici incoraggia l'utilizzo di metodi statici. E i metodi statici sono malvagi. Lo scopo principale dell'inserimento delle dipendenze è consentire al contenitore di creare oggetti per te e di collegarli. Inoltre semplifica i test.

Una volta iniziato a utilizzare metodi statici, non è più necessario creare un'istanza di oggetto e il test è molto più difficile. Inoltre non è possibile creare più istanze di una data classe, ognuna con una dipendenza diversa da iniettare (perché il campo è implicitamente condiviso e crea uno stato globale - anche il male).


11
L'unico avvertimento a questo che ho riscontrato è durante i test. Se vuoi usarlo @BeforeClassin SpringJUnit4ClassRunner e avere quel metodo per accedere ai bean @Autowirednel test .. in pratica non puoi. Il che è fastidioso.
Jason Polites

4
Questa risposta spiega perché non dovrebbe "t. Ma il vero motivo è che quando il framework tenta di collegare la classe statica in un bean, potrebbe non essere ancora caricato dal class loader.
Andrea T

51
Questa risposta è completamente priva di senso. La primavera non impone la tua strategia di test. La risposta è che non c'è ancora la libreria Spring caricata quando la classe statica viene istanziata dal programma di caricamento classi.
Andrea T

7
La risposta di @AndreaT dovrebbe essere la risposta accettata.
Chirag Agrawal

3
I metodi statici sono PIÙ FACILI da testare, non più difficili. Avere la primavera inietta automaticamente le dipendenze sembra bello, ma in realtà è il percorso più difficile per i test. Mock, stub e test double sono odori di codice, non metodi statici.
mttdbrd

150

Perché quando il programma di caricamento classi carica i valori statici, il contesto Spring non è ancora necessariamente caricato. Quindi il programma di caricamento classi non inserirà correttamente i campi statici nel bean e fallirà.


46
Grazie per una risposta che sembra rispondere effettivamente alla domanda piuttosto che esprimere semplicemente un'opinione secondo cui metà del linguaggio Java è una cattiva idea.
Warren Dew

1
"classe statica"?
Arun Raaj

Questo non sembra corretto, poiché Mockito è in grado di iniettare oggetti in campi statici, in modo simile a come la primavera fa l'autowiring ... anche se non so se l'implementazione è la stessa. Hai bisogno di più informazioni.
gagarwa

Mockito non può deridere i metodi statici. Devi usare Powermock per deridere i metodi statici
Jaison Varghese il

17

Secondo il concetto OOP, sarebbe una cattiva progettazione se le variabili statiche sono autowired.

La variabile statica non è una proprietà di Object, ma è una proprietà di una classe. Il cablaggio automatico a molla viene eseguito sugli oggetti e questo, secondo me, rende il design pulito. È possibile distribuire l'oggetto bean cablato automaticamente come singleton e ottenere lo stesso risultato definendolo statico.


15

Con questa soluzione è possibile cablare automaticamente i campi statici in primavera.

@Component
public class TestClass {

    private static Test test;

    @Autowired
    public void setTest(Test test) {
        TestClass.test = test;
    }
}

4
Bugfinder si lamenterà dell'impostazione di un campo statico da un metodo non statico.
Neftanic

@Neftanic che fa riferimento a membri statici da quelli non statici funziona, l'inverso no
younes zeboudj
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.