ApplicationEvent,攜帶業務資料。ApplicationContextAware,取得 ApplicationContext 呼叫 publishEvent()。ApplicationListener,覆寫 onApplicationEvent() 過濾處理。public class MessageEvent extends ApplicationEvent {
private String message;
public MessageEvent(Object source, String message) {
super(source);
this.message = message;
}
public String getMessage() { return message; }
public void setMessage(String message) { this.message = message; }
}
public class Publisher implements ApplicationContextAware {
private ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext ctx) throws BeansException {
this.context = ctx;
}
public void publish(String message) {
context.publishEvent(new MessageEvent(this, message));
}
public static void main(String[] args) {
ApplicationContext ctx = new FileSystemXmlApplicationContext("src/applicationContext.xml");
Publisher pub = (Publisher) ctx.getBean("publisher");
pub.publish("Hello World!");
pub.publish("The quick brown fox jumped over the lazy dog");
}
}
public class MessageEventListener implements ApplicationListener {
@Override
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof MessageEvent) {
MessageEvent me = (MessageEvent) event;
System.out.println("Received: " + me.getMessage());
}
}
}
啟動時,ApplicationContext 會自動掃描所有 Bean,找出實作 ApplicationListener 的實例並註冊。發布事件時,容器同步通知所有監聽器,監聽器自行判斷事件型別決定是否處理,實現鬆耦合的觀察者模式。