Spring рекурсивно загружает контекст приложения

Я хочу вызвать метод после загрузки контекста приложения. Я использовал ApplicationListener интерфейс и реализовал onApplicationEvent.

applicationContext.xml

<beans>
    <bean id="loaderContext" class="com.util.Loader" />
    <bean id="testServiceHandler" class="com.bofa.crme.deals.rules.handler.TestServiceHandlerImpl">
</beans>



Loader.java

public class Loader implements ApplicationListener {

   public void onApplicationEvent(ApplicationEvent event) {
         ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
         TestHandlerServiceImpl test = (TestServiceHandlerImpl)context.getBean("testServiceHandler"); 
   }
}

Но приведенный выше код становится рекурсивным. Можно ли получить bean-компонент из контекста приложения внутри onApplicationEvent функции?


person Lolly    schedule 19.12.2014    source источник
comment
Вы снова загружаете контекст приложения; не уверен, чего вы ожидаете. Сделайте это контекстно-зависимым или что-то в этом роде.   -  person Dave Newton    schedule 19.12.2014
comment
Вам следует взглянуть на: stackoverflow.com/questions/1088550/   -  person yunandtidus    schedule 19.12.2014


Ответы (2)


Вместо создания нового контекста для слушателя реализуйте интерфейс ApplicationContextAware, ваш контекст будет внедрен.

person Andres    schedule 19.12.2014

Если вы используете Spring 3 или выше:

Начиная с Spring 3.0, ApplicationListener может в общем объявлять тип события, который его интересует. При регистрации с Spring ApplicationContext события будут соответствующим образом отфильтрованы, при этом слушатель будет вызываться только для сопоставления объектов событий.

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/ApplicationListener.html#onApplicationEvent-E-

который будет выглядеть следующим образом. Также обратите внимание, что это решение гарантирует, что оно будет выполняться только в этом событии (т.е. start / load): мне кажется, что даже если вы вставляете контекст в свой исходный класс, он будет выполняться для любого события.

public class Loader implements ApplicationListener<ContextStartedEvent> {

   public void onApplicationEvent(ContextStartedEvent event) {
         ApplicationContext context = event.getApplicationContext(); 
   }
}

См. Примеры здесь:

http://www.tutorialspoint.com/spring/event_handling_in_spring.htm

person Alan Hay    schedule 19.12.2014