it-swarm.com.de

Holen Sie sich den aktuellen ApplicationContext

Ich verwende Spring MVC für meine Webanwendung. Meine Bohnen sind in "spring-servlet.xml" -Datei geschrieben

Jetzt habe ich eine Klasse MyClass und ich möchte mit Spring Bean auf diese Klasse zugreifen

Im spring-servlet.xml habe ich folgendes geschrieben

<bean id="myClass" class="com.lynas.MyClass" />

Jetzt muss ich mit ApplicationContext darauf zugreifen. 

ApplicationContext context = ??

Damit ich es kann 

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

Wie macht man das??

87
LynAs

Einfach spritzen ..

@Autowired
private ApplicationContext appContext;

oder implementieren Sie diese Schnittstelle: ApplicationContextAware

130
gipinani

Ich denke, dass link der beste Weg ist, um Anwendungskontext an jedem Ort zu erhalten, selbst in der Nicht-Bean-Klasse. Ich finde es sehr nützlich. Hoffe es ist das gleiche für dich. Das Folgende ist der abstrakte Code davon

Neue Klasse erstellen 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;
    }
}

Hinzufügen eines Eintrags in application-context.xml

<bean id="applicationContextProvider"
                        class="com.Java2novice.spring.ApplicationContextProvider"/>

Im Anmerkungsfall (anstelle von application-context.xml)

@Component
public class ApplicationContextProvider implements ApplicationContextAware{
...
}

Holen Sie sich den Kontext so

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

Prost!!

71
Vivek

Für den Fall, dass Sie aus einem HttpServlet auf den Kontext zugreifen müssen, der selbst nicht von Spring instanziiert wird (und daher weder @Autowire noch ApplicationContextAware funktionieren) ...

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

oder

SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);

Bei einigen anderen Antworten sollten Sie zweimal überlegen, bevor Sie dies tun:

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

... da dies Ihnen nicht den aktuellen Kontext gibt, erstellt es eine andere Instanz davon. Was bedeutet, 1) ein bedeutender Speicherplatz und 2) Beans werden von diesen beiden Anwendungskontexten nicht gemeinsam genutzt.

36

Wenn Sie eine Klasse implementieren, die nicht von Spring instanziiert wird, können Sie wie JsonDeserializer Folgendes verwenden:

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

Fügen Sie dies Ihrem Code hinzu

@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;

Dadurch wird myClass einfach in Ihre Anwendung eingefügt 

8
Hitesh Kumar

basierend auf Viveks Antwort, aber ich denke, Folgendes wäre besser:

@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);
    }
}

Das Schreiben von einer Instanzmethode in ein statisches Feld ist eine schlechte Praxis und gefährlich, wenn mehrere Instanzen bearbeitet werden.

3
Juan

Schritt 1 : Fügen Sie folgenden Code in der Klasse ein

@Autowired
private ApplicationContext _applicationContext;

Schritt 2 : Schreiben Sie Getter & Setter 

Schritt 3 : define autowire = "byType" in der XML-Datei, in der die Bean definiert ist

1

Eine andere Möglichkeit besteht darin, applicationContext über das Servlet einzufügen.

Dies ist ein Beispiel für das Einfügen von Abhängigkeiten bei der Verwendung von Spring-Webdiensten.

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

Alternativ können Sie in Ihrer web.xml Anwendungskontext hinzufügen (siehe unten)

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

Grundsätzlich versuchen Sie Servlet mitzuteilen, dass es nach Beans suchen soll, die in diesen Kontextdateien definiert sind.

0
vsingh

Es gibt viele Möglichkeiten, um den Anwendungskontext in der Spring-Anwendung abzurufen. Diese sind unten angegeben:

  1. Über 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;
    }
    }
    

Hier setApplicationContext(ApplicationContext applicationContext) Methode erhalten Sie den applicationContext

  1. Via Autowired:

    @Autowired
    private ApplicationContext applicationContext;
    

Hier wird das @Autowired-Schlüsselwort den applicationContext bereitstellen. 

Für weitere Informationen besuchen Sie diesen Thread

Vielen Dank :)

0