Spring получить текущий ApplicationContext

Я использую Spring MVC для своего веб-приложения. Мой beans записан в файле 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");

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

Ответ 1

Просто добавьте его.

@Autowired
private ApplicationContext appContext;

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

Ответ 2

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

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

Добавить запись в application-context.xml

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

В случае аннотаций (вместо application-context.xml)

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

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

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

Ура !!

Ответ 3

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

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

или

SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);

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

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

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

Ответ 4

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

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

Ответ 5

Добавьте это в свой код

@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 в ваше приложение

Ответ 6

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

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

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

Ответ 7

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

@Autowired
private ApplicationContext _applicationContext;

Шаг 2: записать Getter и Setter

Шаг 3: укажите autowire = "byType" в файле xml, в котором определен bean

Ответ 8

Другим способом является внедрение applicationContext через сервлет.

Это пример того, как вводить зависимости при использовании веб-служб 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>

Альтернативным способом является добавление контекста приложения в ваш web.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>

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

Ответ 9

Существует множество способов получить контекст приложения в приложении Spring. Те приведены ниже:

  1. Через 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;
    }
    }
    

Здесь setApplicationContext(ApplicationContext applicationContext) метод вы получите applicationContext

  1. Через Autowired:

    @Autowired
    private ApplicationContext applicationContext;
    

Здесь @Autowired слово @Autowired предоставит applicationContext.

Для получения дополнительной информации посетите эту тему

Спасибо :)

Ответ 10

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

Затем вы можете получить bean:

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

Ссылка: springbyexample.org