it-swarm.com.ru

Весна получить текущий 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");

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

87
LynAs

Просто введите это ..

@Autowired
private ApplicationContext appContext;

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

130
gipinani

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

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

Ура !!

71
Vivek

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

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

или же

SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);

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

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

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

36
Jaroslav Záruba

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

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

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

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

8
Hitesh Kumar

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

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

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

3
Juan

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

@Autowired
private ApplicationContext _applicationContext;

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

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

1
Kamlesh Paunikar

Другой способ - внедрить 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>

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

0
vsingh

Существует множество способов получить контекст приложения в приложении 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 предоставит applicationContext. 

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

Спасибо :)

0
Md. Sajedul Karim