¿Por qué no podemos conectar automáticamente los campos estáticos en primavera?

96

¿Por qué no podemos conectar automáticamente la variable de instancia estática en el bean Spring? Sé que hay otra forma de lograr esto, pero solo quiero saber por qué no podemos hacerlo de la siguiente manera.

p.ej

@Autowired
public static Test test;
Ashu
fuente
¿Puedes aclarar un poco la forma alternativa a la que te refieres?
samshers
Puede autowire a través del constructor o usar @PostConstuct
gagarwa

Respuestas:

69

Porque el uso de campos estáticos fomenta el uso de métodos estáticos. Y los métodos estáticos son malos. El propósito principal de la inyección de dependencias es permitir que el contenedor cree objetos para usted y los conecte. También facilita las pruebas.

Una vez que comience a usar métodos estáticos, ya no necesitará crear una instancia de objeto y las pruebas serán mucho más difíciles. Además, no puede crear varias instancias de una clase determinada, cada una con una dependencia diferente que se inyecta (porque el campo se comparte implícitamente y crea un estado global, también malvado).

Tomasz Nurkiewicz
fuente
11
La única advertencia a esto que he encontrado es durante las pruebas. Si desea usar @BeforeClassen un SpringJUnit4ClassRunner, y ese método accede a beans @Autowireden la prueba ... básicamente no puede. Lo que es molesto.
Jason Polites
4
Esta respuesta explica por qué no debería hacerlo. Pero el motivo real es que cuando el marco intenta conectar la clase estática en un bean, es posible que el cargador de clases aún no lo haya cargado.
Andrea T
51
Esta respuesta es completamente insensata. Spring no impone su estrategia de prueba. La respuesta es que aún no hay una biblioteca Spring cargada cuando el cargador de clases crea una instancia de la clase estática.
Andrea T
7
La respuesta de @AndreaT debería ser la respuesta aceptada.
Chirag Agrawal
3
Los métodos estáticos son MÁS FÁCILES de probar, no más difíciles. Hacer que Spring inyecte dependencias automáticamente parece agradable, pero en realidad esa es la ruta más difícil de probar. Los simulacros, los stubs y los dobles de prueba son olores de código, no métodos estáticos.
mttdbrd
150

Porque cuando el cargador de clases carga los valores estáticos, el contexto de Spring todavía no está necesariamente cargado. Entonces, el cargador de clases no inyectará correctamente los campos estáticos en el bean y fallará.

Andrea T
fuente
46
Gracias por una respuesta que parece responder realmente a la pregunta en lugar de simplemente expresar una opinión de que la mitad del lenguaje Java es una mala idea.
Warren Dew
1
"clase estática"?
Arun Raaj
Esto no parece correcto, ya que Mockito es capaz de inyectar objetos en campos estáticos, de forma similar a cómo Spring hace el cableado automático ... aunque no sé si la implementación es la misma. Necesito más información.
gagarwa
Mockito no puede burlarse de los métodos estáticos. Necesita usar Powermock para simular métodos estáticos
Jaison Varghese
17

Según el concepto de programación orientada a objetos, sería un mal diseño si las variables estáticas se conectan automáticamente.

La variable estática no es una propiedad de Object, pero es una propiedad de una clase. El cableado automático de resorte se realiza en objetos, y eso, en mi opinión, hace que el diseño sea limpio. Puede implementar el objeto bean con cableado automático como singleton y lograr lo mismo que definirlo estático.

Sebastián Subin
fuente
15

Con esta solución, puede conectar automáticamente campos estáticos en primavera.

@Component
public class TestClass {

    private static Test test;

    @Autowired
    public void setTest(Test test) {
        TestClass.test = test;
    }
}
Parth Solanki
fuente
4
Bugfinder se quejará de la configuración de un campo estático desde un método no estático.
Neftanic
@Neftanic hacer referencia a miembros estáticos de miembros no estáticos funciona, lo contrario no funciona
younes zeboudj