Pourquoi ne pouvons-nous pas effectuer le câblage automatique des champs statiques au printemps?


96

Pourquoi ne pouvons-nous pas activer automatiquement la variable d'instance statique dans le bean Spring. Je sais qu'il existe un autre moyen d'y parvenir, mais je veux juste savoir pourquoi nous ne pouvons pas le faire de la manière ci-dessous.

par exemple

@Autowired
public static Test test;

pouvez-vous déchiqueter un peu de lumière sur l'autre manière dont vous parlez.
samshers

Vous pouvez passer automatiquement via le constructeur ou utiliser @PostConstuct
gagarwa

Réponses:


69

Parce que l'utilisation de champs statiques encourage l'utilisation de méthodes statiques. Et les méthodes statiques sont mauvaises. L'objectif principal de l'injection de dépendances est de permettre au conteneur de créer des objets pour vous et de les câbler. Cela facilite également les tests.

Une fois que vous commencez à utiliser des méthodes statiques, vous n'avez plus besoin de créer une instance d'objet et les tests sont beaucoup plus difficiles. De plus, vous ne pouvez pas créer plusieurs instances d'une classe donnée, chacune avec une dépendance différente en cours d'injection (car le champ est implicitement partagé et crée un état global - également mauvais).


11
La seule mise en garde que j'ai rencontrée concerne les tests. Si vous voulez utiliser @BeforeClassdans un SpringJUnit4ClassRunner, et que cette méthode accède aux beans @Autowireddans le test ... vous ne pouvez pas fondamentalement. Ce qui est ennuyeux.
Jason Polites

4
Cette réponse explique pourquoi il ne devrait pas "t. Mais le vrai motif est que lorsque le framework essaie de câbler la classe statique dans un bean, il peut ne pas être encore chargé par le chargeur de classe.
Andrea T

51
Cette réponse est complètement insensée. Spring n'impose pas votre stratégie de test. La réponse est qu'il n'y a pas encore de bibliothèque Spring chargée lorsque la classe statique est instanciée par le chargeur de classe.
Andrea T

7
La réponse de @AndreaT devrait être la réponse acceptée.
Chirag Agrawal

3
Les méthodes statiques sont PLUS FACILES à tester, pas plus difficiles. Avoir Spring injecter automatiquement les dépendances semble bien, mais c'est en fait la voie la plus difficile pour les tests. Les simulacres, les stubs et les doubles de test sont des odeurs de code, pas des méthodes statiques.
mttdbrd

150

Parce que lorsque le chargeur de classe charge les valeurs statiques, le contexte Spring n'est pas encore nécessairement chargé. Ainsi, le chargeur de classe n'injectera pas correctement les champs statiques dans le bean et échouera.


46
Merci pour une réponse qui semble réellement répondre à la question plutôt que d'exprimer simplement une opinion selon laquelle la moitié du langage Java est une mauvaise idée.
Warren Dew

1
"classe statique"?
Arun Raaj

Cela ne semble pas correct, car Mockito est capable d'injecter des objets dans des champs statiques, de la même manière que le ressort fait l'autowiring ... bien que je ne sache pas si l'implémentation est la même. Besoin de plus d'informations.
gagarwa le

Mockito ne peut pas se moquer des méthodes statiques. Vous devez utiliser Powermock pour simuler les méthodes statiques
Jaison Varghese

17

Selon le concept de la POO, ce sera une mauvaise conception si les variables statiques sont câblées automatiquement.

La variable statique n'est pas une propriété d'Object, mais c'est une propriété d'une classe. Le câblage automatique à ressort est effectué sur des objets, ce qui rend la conception propre à mon avis. Vous pouvez déployer l'objet bean câblé automatique en tant que singleton et obtenir le même résultat que le définir statique.


15

Grâce à cette solution, vous pouvez câbler automatiquement des champs statiques au printemps.

@Component
public class TestClass {

    private static Test test;

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

4
Bugfinder se plaindra de la configuration d'un champ statique à partir d'une méthode non statique.
Neftanic

@Neftanic référençant des membres statiques à partir de membres non statiques fonctionne, l'inverse ne fonctionne pas
younes zeboudj
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.