2016-07-07 6 views
2

Ich habe eine Implementierung von Spring ApplicationListener. Es funktioniert gut und empfängt Ereignisse, wenn es als Bean in Context XML-Datei deklariert wird oder wenn ich @Component Annotation verwende.Wie wird eine Spring ApplicationListener-Implementierung über Code registriert?

Es werden jedoch keine Ereignisse empfangen, wenn ich es manuell über den Code unter Verwendung der registerSingleton() Methode über den Code registriere.

Ich habe unten einen Beispielcode hinzugefügt, der die Arbeit beschreibt und nicht funktioniert.

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

Ist es nicht möglich, einen ApplicationListener durch Code registrieren?

Antwort

2

Wenn die Bean als Singleton registriert wird, kann sie nicht in ApplicationEvents zurückgerufen werden.

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

sollte ich habe den Verweis auf Application dies zu

context.addApplicationListener(new CustomEventHandler()); 

geändert werden, um die ApplicationListener Umsetzung der ApplicationEventMulticaster hinzufügen, die Ereignisse zu ApplicationListeners

+0

veröffentlicht. Gibt es angesichts dieses Bean-Anwendungskontexts eine Möglichkeit, ApplicationEvent über Code zu empfangen? –

+0

Geben Sie den Code ein, um Ihr funktionierendes Beispiel und nicht funktionierendes Beispiel anzuzeigen. – UserF40

+0

Ich habe einen Beispielcode geschrieben, der die Arbeit und nicht die Arbeit beschreibt. Bitte sehen Sie, ob Sie helfen können. –

Verwandte Themen