Ответ 1
Просто добавьте его.
@Autowired
private ApplicationContext appContext;
или реализовать этот интерфейс: ApplicationContextAware
Я использую 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");
Как это сделать?
Просто добавьте его.
@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;
}
}
Добавить запись в 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);
Ура !!
Если вам нужно получить доступ к контексту из HttpServlet, который сам не создается Spring (и, следовательно, не будут работать @Autowire и ApplicationContextAware)...
WebApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
или
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
Как и для некоторых других ответов, подумайте дважды, прежде чем делать это:
new ClassPathXmlApplicationContext("..."); // are you sure?
... поскольку это не дает вам текущий контекст, а создает другой экземпляр для вас. Это означает, что 1) значительная часть памяти и 2) beans не разделяются между этими двумя контекстами приложения.
Если вы реализуете класс, не созданный 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 в ваше приложение
на основании ответа 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);
}
}
Запись из метода экземпляра в статическое поле является плохой практикой и опасна, если манипулируют несколькими экземплярами.
Шаг 1: введите следующий код в классе
@Autowired
private ApplicationContext _applicationContext;
Шаг 2: записать Getter и Setter
Шаг 3: укажите autowire = "byType" в файле xml, в котором определен bean
Другим способом является внедрение 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, определенный в этих файлах контекста.
Существует множество способов получить контекст приложения в приложении Spring. Те приведены ниже:
Через 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
Через Autowired:
@Autowired
private ApplicationContext applicationContext;
Здесь @Autowired
слово @Autowired
предоставит applicationContext.
Для получения дополнительной информации посетите эту тему
Спасибо :)
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/spring-servlet.xml");
Затем вы можете получить bean:
MyClass myClass = (MyClass) context.getBean("myClass");
Ссылка: springbyexample.org