226 votes

Obtenir le contexte de l'application printanière

Existe-t-il un moyen de demander statiquement / globalement une copie de ApplicationContext dans une application Spring?

En supposant que la classe principale démarre et initialise le contexte de l'application, doit-elle le faire passer par la pile d'appels à toutes les classes qui en ont besoin ou est-il possible pour une classe de demander le contexte précédemment créé? (Ce que je suppose doit être un singleton?)

Merci!

176voto

Don Kirkby Points 12671

Si l'objet qui a besoin d'accéder au conteneur est un haricot dans le récipient, mettre en œuvre la BeanFactoryAware ou ApplicationContextAware interfaces.

Si un objet extérieur du récipient, les besoins d'accès au conteneur, j'ai utilisé un standard GoF pattern singleton pour le printemps conteneur. De cette façon, vous n'avez qu'un singleton dans votre application, le reste sont tous singleton haricots dans le conteneur.

125voto

Piotrek De Points 3566

Vous pouvez implémenter ApplicationContextAware , ou simplement utiliser @Autowired:

public class SpringBean {
  @Autowired
  private ApplicationContext appContext;
}

SpringBean sera ApplicationContext injectée, au sein de laquelle ce bean est instancié. Par exemple, si vous avez une application web avec une jolie norme contextes hiérarchie:

main application context <- (child) MVC context

et SpringBean est déclarée dans le contexte principal, il aura contexte principal est injecté; sinon, si elle est déclarée à l'intérieur d'MVC contexte, il aura MVC contexte injecté.

40voto

Steve B. Points 23227

Voici une belle façon (pas de mine, la référence d'origine est ici: http://sujitpal.blogspot.com/2007/03/accessing-spring-beans-from-legacy-code.html

J'ai utilisé cette méthode et elle fonctionne très bien. En gros, c'est un simple haricot qui est titulaire d'un (statique) référence au contexte de l'application. En faisant référence au printemps config c'est initialisée.

Jetez un oeil à l'original de la ref, c'est très clair.

18voto

stian Points 1731

Je crois que vous pourriez utiliser SingletonBeanFactoryLocator. L'beanRefFactory.xml le fichier de tenir le réel applicationContext, Ce serait quelque chose comme ceci:

<bean id="mainContext" class="org.springframework.context.support.ClassPathXmlApplicationContext">
     <constructor-arg>
        <list>
            <value>../applicationContext.xml</value>
        </list>
     </constructor-arg>
 </bean>

Et le code pour obtenir un de la fève de applicationcontext d'où serait quelque chose comme ceci:

BeanFactoryLocator bfl = SingletonBeanFactoryLocator.getInstance();
BeanFactoryReference bf = bfl.useBeanFactory("mainContext");
SomeService someService = (SomeService) bf.getFactory().getBean("someService");

Le Printemps de l'équipe de décourager l'utilisation de cette classe et yadayada, mais il a me convenait bien où je l'ai utilisé.

11voto

belugabob Points 2966

Avant de mettre en œuvre toutes les autres suggestions, posez-vous ces questions...

  • Pourquoi suis-je en train d'essayer d'obtenir l'ApplicationContext?
  • Je suis de l'utilisation efficace de l'ApplicationContext comme un localisateur de service?
  • Puis-je éviter d'accès à l'ApplicationContext à tous?

Les réponses à ces questions sont plus faciles dans certains types d'applications (applications Web, par exemple) que dans d'autres, mais ils sont la peine de demander de toute façon.

Accéder à l'ApplicationContext ne sorte de violer l'ensemble de l'injection de dépendance principe, mais parfois vous n'avez pas vraiment le choix.

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