Warum können wir statische Felder im Frühjahr nicht automatisch verdrahten?


96

Warum können wir die statische Instanzvariable in der Spring Bean nicht automatisch verdrahten? Ich weiß, dass es einen anderen Weg gibt, dies zu erreichen, aber ich möchte nur wissen, warum wir es nicht so machen können.

z.B

@Autowired
public static Test test;

Können Sie etwas Licht auf die alternative Art und Weise bringen, auf die Sie sich beziehen?
Samshers

Sie können automatisch durch den Konstruktor verdrahten oder @PostConstuct
gagarwa

Antworten:


69

Weil die Verwendung statischer Felder die Verwendung statischer Methoden fördert. Und statische Methoden sind böse. Der Hauptzweck der Abhängigkeitsinjektion besteht darin, dass der Container Objekte für Sie erstellt und diese verkabelt. Außerdem erleichtert es das Testen.

Sobald Sie anfangen, statische Methoden zu verwenden, müssen Sie keine Objektinstanz mehr erstellen, und das Testen ist viel schwieriger. Sie können auch nicht mehrere Instanzen einer bestimmten Klasse erstellen, von denen jede eine andere Abhängigkeit aufweist (da das Feld implizit gemeinsam genutzt wird und einen globalen Status erzeugt - auch böse).


11
Die einzige Einschränkung, auf die ich gestoßen bin, ist beim Testen. Wenn Sie @BeforeClassin einem SpringJUnit4ClassRunner verwenden möchten und diese Methode @Autowiredim Test auf Beans zugreifen möchten, können Sie dies im Grunde nicht. Welches ist ärgerlich.
Jason Polites

4
Diese Antwort erklärt, warum dies nicht der Fall sein sollte. Das eigentliche Motiv ist jedoch, dass das Framework, wenn es versucht, die statische Klasse in eine Bean zu verkabeln, möglicherweise noch nicht vom Klassenlader geladen wird
Andrea T,

51
Diese Antwort ist völlig sinnlos. Der Frühling setzt Ihre Teststrategie nicht durch. Die Antwort ist, dass noch keine Spring-Bibliothek geladen ist, wenn statische Klassen vom Klassenladeprogramm instanziiert werden.
Andrea T

7
Die Antwort von @AndreaT sollte die akzeptierte Antwort sein.
Chirag Agrawal

3
Statische Methoden sind einfacher zu testen, nicht schwieriger. Es scheint schön, wenn Spring Abhängigkeiten automatisch injiziert, aber das ist tatsächlich der schwierigere Weg zum Testen. Mocks, Stubs und Test-Doubles sind Code-Gerüche, keine statischen Methoden.
mttdbrd

150

Denn wenn der Klassenlader die statischen Werte lädt, ist der Spring-Kontext noch nicht unbedingt geladen. Der Klassenlader fügt die statischen Felder in der Bean daher nicht ordnungsgemäß ein und schlägt fehl.


46
Vielen Dank für eine Antwort, die die Frage tatsächlich zu beantworten scheint, anstatt nur die Meinung zu äußern, dass die Hälfte der Java-Sprache eine schlechte Idee ist.
Warren Dew

1
"statische Klasse"?
Arun Raaj

Dies scheint nicht korrekt zu sein, da Mockito Objekte in statische Felder einfügen kann, ähnlich wie Spring automatisch verdrahtet ... obwohl ich nicht weiß, ob die Implementierung dieselbe ist. Benötigen Sie weitere Informationen.
Gagarwa

Mockito kann statische Methoden nicht verspotten. Sie müssen Powermock verwenden, um statische Methoden zu verspotten
Jaison Varghese

17

Nach dem OOP-Konzept ist es ein schlechtes Design, wenn statische Variablen automatisch verdrahtet werden.

Statische Variable ist keine Eigenschaft von Object, aber eine Eigenschaft einer Klasse. Die automatische Federverdrahtung erfolgt an Objekten, und das macht das Design meiner Meinung nach sauber. Sie können das automatisch verdrahtete Bean-Objekt als Singleton bereitstellen und das Gleiche wie statisch definieren.


15

Mit dieser Lösung können Sie statische Felder im Frühjahr automatisch verdrahten.

@Component
public class TestClass {

    private static Test test;

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

4
Bugfinder wird sich über das Einrichten eines statischen Feldes mit einer nicht statischen Methode beschweren.
Neftanic

@Neftanic Referenzieren von statischen Mitgliedern von nicht statischen funktioniert, die Umkehrung nicht
younes zeboudj
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.