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.
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).
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á.
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.
Respostas:
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).
fonte
@BeforeClass
em um SpringJUnit4ClassRunner e ter esse método de acesso aos beans@Autowired
no teste ... você basicamente não pode. O que é irritante.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á.
fonte
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.
fonte
Com esta solução, você pode autowired campos estáticos na primavera.
fonte