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;
Ashu
fonte
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).

Tomasz Nurkiewicz
fonte
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á.

Andrea T
fonte
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.

Subin Sebastian
fonte
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;
    }
}
Parth Solanki
fonte
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