web-dev-qa-db-fra.com

Printemps obtenir le contexte d'application actuel

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 ??

87
LynAs

Il suffit de l'injecter ..

@Autowired
private ApplicationContext appContext;

ou implémenter cette interface: ApplicationContextAware

130
gipinani

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é!!

71
Vivek

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.

36
Jaroslav Záruba

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);
23
rzymek

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 

8
Hitesh Kumar

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.

3
Juan

É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

1
Kamlesh Paunikar

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.

0
vsingh

Il existe de nombreuses façons d'obtenir le contexte d'application dans l'application Spring. Ceux-ci sont donnés ci-dessous:

  1. 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

  1. 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 :)

0
Md. Sajedul Karim