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?
veröffentlicht. Gibt es angesichts dieses Bean-Anwendungskontexts eine Möglichkeit, ApplicationEvent über Code zu empfangen? –
Geben Sie den Code ein, um Ihr funktionierendes Beispiel und nicht funktionierendes Beispiel anzuzeigen. – UserF40
Ich habe einen Beispielcode geschrieben, der die Arbeit und nicht die Arbeit beschreibt. Bitte sehen Sie, ob Sie helfen können. –