Весна получить текущий 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 ответов:
просто введите его..
@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