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 un haricot
Dans le spring-servlet.xml
j'ai écrit ce qui suit
<bean id="myClass" class="com.lynas.MyClass" />
Maintenant, je dois accéder à cela en utilisant ApplicationContext
ApplicationContext context = ??
Pour que je puisse 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 cette lien illustre le meilleur moyen d'obtenir un contexte d'application n'importe où, même dans la classe non-bean. Je trouve cela très utile. J'espère que c'est la même chose pour vous. Le ci-dessous est le code abstrait de celui-ci
Créer 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
<bean id="applicationContextProvider"
class="com.Java2novice.spring.ApplicationContextProvider"/>
Dans le cas des annotations (au lieu de application-context.xml)
@Component
public class ApplicationContextProvider implements ApplicationContextAware{
...
}
Récupère le contexte comme ceci
TestBean tb = ApplicationContextProvider.getApplicationContext().getBean("testBean", TestBean.class);
À votre santé!!
Si vous avez besoin d'accéder au contexte depuis un HttpServlet qui n'est pas lui-même instancié par Spring (et par conséquent, 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 à deux fois avant de faire ceci:
new ClassPathXmlApplicationContext("..."); // are you sure?
... car cela ne vous donne pas le contexte actuel, il en crée une autre instance pour vous. Ce qui signifie 1) une part importante de mémoire et 2) des haricots 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
sur la base de la réponse de Vivek, mais je pense que ce serait mieux:
@Component("applicationContextProvider")
public class ApplicationContextProvider implements ApplicationContextAware {
private static class AplicationContextHolder{
private static final InnerContextResource CONTEXT_PROV = new InnerContextResource();
private AplicationContextHolder() {
super();
}
}
private static final class InnerContextResource {
private ApplicationContext context;
private InnerContextResource(){
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 : Injecte le code suivant en classe
@Autowired
private ApplicationContext _applicationContext;
Étape 2 : Ecrire Getter & Setter
Étape 3 : define autowire = "byType" dans le fichier xml dans lequel le bean est défini
Une autre méthode consiste à injecter applicationContext via servlet.
Voici un exemple d'injection de dépendances lors de l'utilisation de services Web Spring.
<servlet>
<servlet-name>my-soap-ws</servlet-name>
<servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
<init-param>
<param-name>transformWsdlLocations</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:my-applicationContext.xml</param-value>
</init-param>
<load-on-startup>5</load-on-startup>
</servlet>
Une autre méthode consiste à ajouter un contexte d'application dans votre fichier web.xml, comme indiqué ci-dessous.
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/classes/my-another-applicationContext.xml
classpath:my-second-context.xml
</param-value>
</context-param>
En gros, vous essayez d'indiquer à servlet qu'il doit rechercher les beans définis dans ces fichiers de contexte.
Il existe de nombreuses façons d'obtenir le contexte d'application dans l'application Spring. Ceux-ci sont donnés ci-dessous:
Via ApplicationContextAware:
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class AppContextProvider implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}
Ici, la méthode setApplicationContext(ApplicationContext applicationContext)
vous permettra d'obtenir l'applicationContext
Via Autowired:
@Autowired
private ApplicationContext applicationContext;
Ici, le mot clé @Autowired
fournira le champ applicationContext.
Pour plus d'informations, visitez ce fil de discussion
Merci :)