Spring get current ApplicationContext

J’utilise Spring MVC pour mon application web. Mes beans sont écrits dans le fichier ” spring-servlet.xml

Maintenant, j’ai une classe MyClass et je veux accéder à cette classe en utilisant le haricot de spring

Dans le spring-servlet.xml j’ai écrit ce qui suit

  

Maintenant, je dois y accéder en utilisant ApplicationContext

 ApplicationContext context = ?? 

Alors que je peux faire

 MyClass myClass = (MyClass) context.getBean("myClass"); 

Comment faire ça?

Il suffit de l’injecter ..

 @Autowired private ApplicationContext appContext; 

ou implémenter cette interface: ApplicationContextAware

Je pense que ce lien illustre le meilleur moyen d’obtenir un contexte d’application n’importe où, même dans la classe non bean. Je trouve ça très utile. J’espère que c’est pareil pour vous. Le ci-dessous est le code abstrait de celui-ci

Créez une nouvelle classe ApplicationContextProvider.java

 package com.java2novice.spring; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; public class ApplicationContextProvider implements ApplicationContextAware{ private static ApplicationContext context; public static ApplicationContext getApplicationContext() { return context; } @Override public void setApplicationContext(ApplicationContext ac) throws BeansException { context = ac; } } 

Ajouter une entrée dans application-context.xml

  

Obtenez le contexte comme ça

 TestBean tb = ApplicationContextProvider.getApplicationContext().getBean("testBean", TestBean.class); 

À votre santé!!

Au cas où vous auriez besoin d’accéder au contexte depuis un HttpServlet qui n’est pas instancié par Spring (et donc ni @Autowire ni ApplicationContextAware ne fonctionneront) …

 WebApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext()); 

ou

 SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this); 

En ce qui concerne certaines des autres réponses, réfléchissez-y à deux fois avant de faire ceci:

 new ClassPathXmlApplicationContext("..."); // are you sure? 

… comme cela ne vous donne pas le contexte actuel, il en crée une autre pour vous. Ce qui signifie 1) une partie importante de la mémoire et 2) les beans ne sont pas partagés entre ces deux contextes d’application.

Si vous implémentez une classe qui n’est pas instanciée par Spring, comme un JsonDeserializer, vous pouvez utiliser:

 WebApplicationContext context = ContextLoader.getCurrentWebApplicationContext(); MyClass myBean = context.getBean(MyClass.class); 

Ajoutez ceci à votre code

 @Autowired private ApplicationContext _applicationContext; //Add below line in your calling method MyClass class = (MyClass) _applicationContext.getBean("myClass"); // Or you can simply use this, put the below code in your controller data member declaration part. @Autowired private MyClass myClass; 

Cela va simplement injecter myClass dans votre application

basé sur la réponse de Vivek, mais je pense que ce qui suit serait préférable:

 @Component("applicationContextProvider") public class ApplicationContextProvider implements ApplicationContextAware { private static class AplicationContextHolder{ private static final ContextResource CONTEXT_PROV = new ContextResource(); private AplicationContextHolder() { super(); } } private static final class ContextResource { private ApplicationContext context; private ContextResource(){ super(); } private void setContext(ApplicationContext context){ this.context = context; } } public static ApplicationContext getApplicationContext() { return AplicationContextHolder.CONTEXT_PROV.context; } @Override public void setApplicationContext(ApplicationContext ac) { AplicationContextHolder.CONTEXT_PROV.setContext(ac); } } 

L’écriture d’une méthode d’instance dans un champ statique est une mauvaise pratique et dangereuse si plusieurs instances sont manipulées.

Étape 1 : Injecter le code suivant dans la classe

 @Autowired private ApplicationContext _applicationContext; 

Étape 2 : Écrivez Getter & Setter

Etape 3 : définir autowire = “byType” dans le fichier XML dans lequel le bean est défini

Une autre façon consiste à injecter applicationContext via servlet.

Ceci est un exemple de la façon d’injecter des dépendances lors de l’utilisation des services Web Spring.

  my-soap-ws org.springframework.ws.transport.http.MessageDispatcherServlet  transformWsdlLocations false   contextConfigLocation classpath:my-applicationContext.xml  5  

Une autre manière consiste à append le contexte de l’application dans votre fichier web.xml, comme indiqué ci-dessous.

  contextConfigLocation  /WEB-INF/classes/my-another-applicationContext.xml classpath:my-second-context.xml   

Fondamentalement, vous essayez de dire à servlet qu’il doit rechercher les beans définis dans ces fichiers de contexte.