Dlaczego wiosną nie możemy autoprzewodować pól statycznych?

96

Dlaczego nie możemy automatycznie podłączyć statycznej zmiennej instancji w komponencie bean Spring. Wiem, że jest inny sposób, aby to osiągnąć, ale chcę tylko wiedzieć, dlaczego nie możemy tego zrobić w poniższy sposób.

na przykład

@Autowired
public static Test test;
Ashu
źródło
czy możesz rzucić trochę światła na alternatywny sposób, o którym się mówisz.
samshers
Możesz autowire przez konstruktora lub użyć @PostConstuct
gagarwa

Odpowiedzi:

69

Ponieważ używanie pól statycznych zachęca do korzystania z metod statycznych. A metody statyczne są złe. Głównym celem wstrzykiwania zależności jest umożliwienie kontenerowi tworzenia obiektów i łączenia ich. Ułatwia również testowanie.

Gdy zaczniesz używać metod statycznych, nie musisz już tworzyć instancji obiektu, a testowanie jest znacznie trudniejsze. Nie możesz także stworzyć kilku instancji danej klasy, z których każda będzie miała inną zależność (ponieważ pole jest niejawnie współdzielone i tworzy stan globalny - także zły).

Tomasz Nurkiewicz
źródło
11
Jedyne zastrzeżenie, które napotkałem, dotyczy testów. Jeśli chcesz użyć @BeforeClassw SpringJUnit4ClassRunner i mieć tę metodę dostępu do komponentów bean @Autowiredw teście, w zasadzie nie możesz. Co jest denerwujące.
Jason Polites
4
Ta odpowiedź wyjaśnia, dlaczego nie powinno. Ale prawdziwym motywem jest to, że kiedy framework próbuje połączyć statyczną klasę z komponentem bean, może nie zostać jeszcze załadowany przez program ładujący klasy.
Andrea T
51
Ta odpowiedź jest całkowicie bezsensowna. Spring nie narzuca twojej strategii testowania. Odpowiedź jest taka, że ​​nie ma jeszcze załadowanej biblioteki Spring, gdy statyczna klasa jest tworzona przez program ładujący klasy.
Andrea T
7
Odpowiedź @AndreaT powinna być odpowiedzią zaakceptowaną.
Chirag Agrawal
3
Metody statyczne są ŁATWIEJSZE do testowania, a nie trudniejsze. Automatyczne wstrzykiwanie zależności przez sprężynę wydaje się przyjemne, ale w rzeczywistości jest to trudniejsza droga do testowania. Mocks, stubs i test double to zapachy kodu, a nie statyczne metody.
mttdbrd
150

Ponieważ program ładujący klasy ładuje wartości statyczne, kontekst Spring niekoniecznie jest jeszcze ładowany. Więc moduł ładujący klasy nie wprowadzi prawidłowo pól statycznych do fasoli i zawiedzie.

Andrea T
źródło
48
Dziękuję za odpowiedź, która wydaje się odpowiadać na pytanie, a nie tylko wyrażać opinię, że połowa języka Java to zły pomysł.
Warren Dew
1
„klasa statyczna”?
Arun Raaj
To nie wydaje się poprawne, ponieważ Mockito jest w stanie wstrzykiwać obiekty w pola statyczne, podobnie jak w przypadku autowiring wiosny ... chociaż nie wiem, czy implementacja jest taka sama. Potrzebujesz więcej informacji.
gagarwa
Mockito nie może naśladować metod statycznych. Musisz użyć Powermocka, aby kpić z metod statycznych
Jaison Varghese
17

Zgodnie z koncepcją OOP projekt będzie złym rozwiązaniem, jeśli zmienne statyczne będą automatycznie dołączane.

Zmienna statyczna nie jest własnością Object, ale jest właściwością klasy. Automatyczne okablowanie sprężynowe odbywa się na obiektach, co moim zdaniem sprawia, że ​​projekt jest czysty. Możesz wdrożyć obiekt automatu bean jako singleton i osiągnąć to samo, co zdefiniowanie go jako statycznego.

Subin Sebastian
źródło
15

Dzięki temu rozwiązaniu wiosną można automatycznie łączyć pola statyczne.

@Component
public class TestClass {

    private static Test test;

    @Autowired
    public void setTest(Test test) {
        TestClass.test = test;
    }
}
Parth Solanki
źródło
4
Bugfinder będzie narzekał na ustawienie pola statycznego z metody niestatycznej.
Neftanic
@Neftanic członkowie odsyłania statyczne od tych non-statyczne prace, odwrotna nie
Younes zeboudj