Весна получить текущий ApplicationContext


Я использую Spring MVC для моего веб-приложения. Мои бобы написаны в "spring-servlet.xml файл"

теперь у меня есть класс MyClass и я хочу получить доступ к этому классу с помощью spring bean

на spring-servlet.xml Я написал следующее

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

теперь мне нужно получить доступ к этому с помощью ApplicationContext

ApplicationContext context = ??

так что я могу сделать

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

как это сделать??

9 77

9 ответов:

просто введите его..

@Autowired
private ApplicationContext appContext;

или реализовать этот интерфейс: ApplicationContextAware

Я думаю, что это ссылке демонстрирует лучший способ получить контекст приложения в любом месте, даже в зернах класса. Я нахожу это очень полезным. Надеюсь, что это то же самое для вас. Ниже приведен абстрактный код этого

создать новый класс 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;
    }
}

добавить запись в контекст приложения.xml

<bean id="applicationContextProvder"
                        class="com.java2novice.spring.ApplicationContextProvider"/>

получить контекст, как это

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

Ура!!

В случае, если вам нужно получить доступ к контекстному из HttpServlet, который сам по себе не создается Spring (и поэтому ни @Autowire, ни ApplicationContextAware не будут работать)...

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

или

SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);

Что касается некоторых других ответов,подумайте дважды, прежде чем ты сделаешь это:

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

...так как это не дает вам текущий контекст, скорее он создает другой экземпляр для вас. Что означает 1) значительный кусок памяти и 2) бобы не являются общими для этих двух контекстов приложения.

Если вы реализуете класс, который не создан Spring, например JsonDeserializer, вы можете использовать:

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

добавьте это в ваш код

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

Это будет просто ввести myClass в ваше приложение

основываясь на ответе Вивека, но я думаю, что следующее Было бы лучше:

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

запись из метода экземпляра в статическое поле является плохой практикой и опасной, если манипулируется несколькими экземплярами.

Шаг 1 :введите следующий код в класс

@Autowired
private ApplicationContext _applicationContext;

Шаг 2: Написать Геттер И Сеттер

Шаг 3: define autowire= "byType" в xml-файле, в котором определяется bean

другой способ-ввести applicationContext через сервлет.

это пример того, как вводить зависимости при использовании Spring web services.

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

альтернативный способ-добавить контекст приложения в свой веб.XML, как показано ниже

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

в основном вы пытаетесь сказать сервлету, что он должен искать бобы, определенные в этих контекстных файлах.

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/spring-servlet.xml");

затем вы можете получить Боб:

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

Ссылка:springbyexample.org