2016-07-07 4 views
2

Spring ApplicationListenerの実装があります。それは正常に動作し、コンテキストXMLファイル内のBeanとして宣言されている場合、または@Componentアノテーションを使用している場合にイベントを受け取ります。Spring ApplicationListener実装をコードで登録するには?

ConfigurableListableBeanFactoryregisterSingleton()メソッドを使用して手動でコードを登録すると、イベントは受信されません。

私は、動作している場合と動作していない場合について説明するサンプルコードをいくつか追加しました。

CustomEvent.java

package com.test.event; 

import org.springframework.context.ApplicationEvent; 

public class CustomEvent extends ApplicationEvent { 

    public CustomEvent(Object source) { 
     super(source); 
    } 

    public String toString() { 
     return "My Custom Event"; 
    } 
} 

CustomEventPublisher.java

package com.test.event; 

import org.springframework.context.ApplicationEventPublisher; 
import org.springframework.context.ApplicationEventPublisherAware; 

public class CustomEventPublisher implements ApplicationEventPublisherAware { 

    private ApplicationEventPublisher publisher; 

    public void setApplicationEventPublisher(ApplicationEventPublisher publisher) { 
     this.publisher = publisher; 
    } 

    public void publish() { 
     CustomEvent ce = new CustomEvent(this); 
     publisher.publishEvent(ce); 
    } 
} 

CustomEventHandler.java

package com.test.event; 

import org.springframework.context.ApplicationListener; 

public class CustomEventHandler 
    implements ApplicationListener<CustomEvent>{ 

    public void onApplicationEvent(CustomEvent event) { 
     System.out.println(event.toString()); 
    } 

} 

applicationContextWithListenerBean.xml

<?xml version="1.0" encoding="UTF-8"?> 

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> 

    <bean id="customEventHandler" 
     class="com.test.event.CustomEventHandler"/> 

    <bean id="customEventPublisher" 
     class="com.test.event.CustomEventPublisher"/> 

</beans> 

applicationContextWithoutListenerBean.xml

<?xml version="1.0" encoding="UTF-8"?> 

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> 

    <bean id="customEventPublisher" 
     class="com.test.event.CustomEventPublisher"/> 

</beans> 

MainApp.java

package com.test.event; 

import org.springframework.context.ConfigurableApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

public class MainApp { 
    public static void main(String[] args){ 

     /* The below code works fine when listener bean customEventHandler is defined in xml */ 

     ConfigurableApplicationContext context = new ClassPathXmlApplicationContext(
       "applicationContextWithListenerBean.xml"); 
     CustomEventPublisher cvp = (CustomEventPublisher) context 
       .getBean("customEventPublisher"); 
     cvp.publish(); 
     context.close(); 

     /* The below code doesn't work when listener bean is registered through code. Is it possible to make this work? */ 

     ConfigurableApplicationContext context = new ClassPathXmlApplicationContext(
       "applicationContextWithoutListenerBean.xml"); 
     context.getBeanFactory().registerSingleton("customEventHandler", 
       new CustomEventHandler()); 
     CustomEventPublisher cvp = (CustomEventPublisher) context 
       .getBean("customEventPublisher"); 

     cvp.publish(); 
     context.close(); 
    } 
} 

は、コードをApplicationListenerを登録することはできませんか?

答えて

2

シングルトンとしてBeanを登録しても、BeanをApplicationEventsでコールバックすることはできません。

context.getBeanFactory().registerSingleton("customEventHandler", 
      new CustomEventHandler()); 

は、これは私がのApplicationContextへの参照をしたApplicationListeners

+0

にイベントを発行したApplicationEventMulticasterにApplicationListenerの実装を追加します

context.addApplicationListener(new CustomEventHandler()); 

に変更する必要があります。このBeanとアプリケーションのコンテキストを考えると、コードでApplicationEventを受け取る方法はありますか? –

+0

あなたの作業例と非実際の例を示すコードを投稿してください。 – UserF40

+0

動作しているかどうかを説明するサンプルコードをいくつか掲載しました。あなたが助けることができるかどうか見てください。 –

関連する問題