209 votes

Peut-on utiliser @Autowired avec des champs statiques ?

Y a-t-il un moyen d'utiliser @Autowired avec des champs statiques. Sinon, existe-t-il d'autres moyens de procéder ?

0 votes

165voto

skaffman Points 197885

En bref, non. Vous ne pouvez pas câbler automatiquement ou manuellement des champs statiques dans Spring. Vous devez écrire votre propre logique pour le faire.

6 votes

Lorsque vous trouvez un vieux code qui fait cela, c'est un anti-modèle. Pliez les yeux, inclinez votre tête et trouvez une meilleure façon de résoudre le problème. Vous serez content de l'avoir fait.

4 votes

Este réponse est également utile sur le site de Spring @AutoWired

159voto

Sedat Başar Points 1081
@Component("NewClass")
public class NewClass{
    private static SomeThing someThing;

    @Autowired
    public void setSomeThing(SomeThing someThing){
        NewClass.someThing = someThing;
    }
}

1 votes

Une idée de comment je peux utiliser cette approche lors de l'initialisation d'un référentiel ?

9 votes

L'inconvénient : Il n'y a aucune garantie que someThing a été initialisé en cas d'accès statique : NewClass.staticMethodWhichUsesSomething(); peut générer un NPE si elle est utilisée avant l'initialisation de l'application.

0 votes

Pouvez-vous éviter l'avertissement de Instance methods should not write to "static" fields (squid:S2696) ?

77voto

victor hugo Points 16700

@Autowired peuvent être utilisés avec des setters, de sorte qu'un setter peut modifier un champ statique.

Une dernière suggestion... N'ESSAYEZ PAS

74 votes

Pourquoi suggérez-vous de ne pas le faire ?

3 votes

Hmmm mon sentiment sur la raison pour laquelle ce n'est pas recommandé est, parce qu'alors l'instance statique dans la classe est hors du contrôle de spring. Une fois injecté, le champ statique est le site référence pour toutes les instances d'objets de la classe (environnante) correspondante. Mais, ce comportement pourrait être exactement ce qui est attendu, et donc être considéré comme un bug ou une fonctionnalité...

2 votes

Oui @matthaeus, c'est exactement la fonctionnalité que j'attendais lorsque j'ai eu besoin d'accéder à org.springframework.core.env.Environment : @Component public class SpringAppEnv{ public static Environment _env; @Autowired public void setEnv(Environment env) {_env = env;} }

6voto

Jherico Points 12554

Créez un bean que vous pouvez autowire et qui initialisera la variable statique comme effet secondaire.

3voto

JamesC Points 1244

Vous pouvez y parvenir en utilisant Notation XML et le MethodInvokingFactoryBean . Pour un exemple, regardez aquí .

private static StaticBean staticBean;

public void setStaticBean(StaticBean staticBean) {
   StaticBean.staticBean = staticBean;
}

Vous devez vous efforcer d'utiliser l'injection de printemps lorsque cela est possible, car c'est l'approche recommandée mais ce n'est pas toujours possible, comme vous pouvez l'imaginer, car tout ne peut pas être tiré du conteneur de printemps ou vous avez peut-être affaire à des systèmes hérités.

Les tests de note peuvent également être plus difficiles avec cette approche.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X