2009-06-19 8 views

Répondre

74

En bref, non. Vous ne pouvez pas autowire ou manuellement des champs statiques dans Spring. Vous devrez écrire votre propre logique pour le faire.

+0

Lorsque vous trouvez ancien code faisant cela, il est un anti-modèle. Strabisme, penchez la tête et trouvez une meilleure façon de résoudre le problème. Vous serez heureux de l'avoir fait. –

+0

this [réponse] (http://stackoverflow.com/a/3746611/409976) est également utile sur '@ AutoWired' du printemps –

+0

Vous pouvez trouver plus à jour [répondre ici] (http://stackoverflow.com/a/ 17660550) – nmy

5

Créez un bean que vous pouvez créer automatiquement et qui initialisera la variable statique en tant qu'effet secondaire.

52

@Autowired peut être utilisé avec des setters afin que vous puissiez avoir un setter modifiant un champ statique.

Juste une dernière suggestion ... NE PAS

+4

Clever .... Je ne peux pas me résoudre à upvote cela, cependant :) – skaffman

+33

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

+7

Oui, je suis également intéressé de savoir pourquoi il n'est pas recommandé de le faire ... – will824

4

Vous pouvez y parvenir en utilisant la notation XML et MethodInvokingFactoryBean. Pour un exemple, regardez here.

private static StaticBean staticBean; 

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

Vous devriez viser à utiliser injection de printemps, si possible, car cela est l'approche recommandée mais ce n'est pas toujours possible car je suis sûr que vous pouvez imaginer que tout ne peut pas être tiré du récipient à ressort ou vous peut-être traiter avec des systèmes hérités. Remarque test peut également être plus difficile avec cette approche.

61
@Component 
public class NewClass{ 
    private static SomeThing someThing; 

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

une idée de comment je peux utiliser cette approche lors de l'initialisation d'un dépôt? – kiedysktos

0

Init votre composant autowired dans la méthode @PostConstruct

@Component 
public class TestClass { 
    private static AutowiredTypeComponent component; 

    @Autowired 
    private AutowiredTypeComponent autowiredComponent; 

    @PostConstruct 
    private void init() { 
     component = this.autowiredComponent; 
    } 

    public static void testMethod() { 
     component.callTestMethod(); 
    } 
} 
Questions connexes