Por que não podemos conectar automaticamente campos estáticos na primavera?


96

Por que não podemos autowire a variável de instância estática no bean Spring. Eu sei que há outra maneira de conseguir isso, mas só quero saber por que não podemos fazer da maneira abaixo.

por exemplo

@Autowired
public static Test test;

você pode lançar alguma luz sobre a forma alternativa a que está se referindo.
samshers de

Você pode fazer o autowire por meio do construtor ou usar @PostConstuct
gagarwa

Respostas:


69

Porque o uso de campos estáticos incentiva o uso de métodos estáticos. E os métodos estáticos são maus. O objetivo principal da injeção de dependência é permitir que o contêiner crie objetos para você e conecte-os. Além disso, torna o teste mais fácil.

Depois de começar a usar métodos estáticos, você não precisa mais criar uma instância de objeto e o teste é muito mais difícil. Além disso, você não pode criar várias instâncias de uma determinada classe, cada uma com uma dependência diferente sendo injetada (porque o campo é implicitamente compartilhado e cria um estado global - também maligno).


11
A única advertência que encontrei foi durante os testes. Se você deseja usar @BeforeClassem um SpringJUnit4ClassRunner e ter esse método de acesso aos beans @Autowiredno teste ... você basicamente não pode. O que é irritante.
Jason Polites

4
Esta resposta explica por que não deveria. Mas o motivo real é que quando o framework tenta conectar a classe estática em um bean, ele pode ainda não ter sido carregado pelo carregador de classe.
Andrea T

51
Esta resposta é completamente sem sentido. O Spring não impõe sua estratégia de teste. A resposta é que ainda não há biblioteca Spring carregada quando Class estática é instanciada pelo carregador de classe.
Andrea T

7
A resposta de @AndreaT deve ser a resposta aceita.
Chirag Agrawal

3
Os métodos estáticos são mais fáceis de testar, não mais difíceis. Fazer com que o spring injete dependências automaticamente parece bom, mas esse é realmente o caminho mais difícil para o teste. Mocks, stubs e testes duplos são odores de código, não métodos estáticos.
mttdbrd

150

Porque quando o carregador de classes carrega os valores estáticos, o contexto Spring ainda não está necessariamente carregado. Portanto, o carregador de classes não injetará corretamente os campos estáticos no bean e falhará.


46
Obrigado por uma resposta que parece realmente responder à pergunta, em vez de apenas expressar uma opinião de que metade da linguagem Java é uma má ideia.
Warren Dew

1
"classe estática"?
Arun Raaj

Isso não parece correto, já que o Mockito é capaz de injetar objetos em campos estáticos, semelhante a como o spring faz autowiring ... embora eu não saiba se a implementação é a mesma. Precisa de mais informações.
gagarwa

Mockito não pode simular métodos estáticos. Você precisa usar o Powermock para simular métodos estáticos
Jaison Varghese

17

De acordo com o conceito OOP, será um projeto ruim se as variáveis ​​estáticas forem autowired.

A variável estática não é propriedade de Object, mas é propriedade de uma classe. A fiação automática da mola é feita em objetos, e isso torna o design limpo, na minha opinião. Você pode implantar o objeto bean com fio automático como singleton e obter o mesmo que defini-lo estático.


15

Com esta solução, você pode autowired campos estáticos na primavera.

@Component
public class TestClass {

    private static Test test;

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

4
Bugfinder reclamará sobre a configuração de campo estático de um método não estático.
Neftanic

@Neftanic referenciar membros estáticos de não estáticos funciona, o inverso não
younes zeboudj
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.