1. 程式人生 > 實用技巧 >Spring中的事件機制

Spring中的事件機制

Spring中的事件機制

Spring對事件機制也提供了支援,一個事件被髮布後,被對應的監聽器監聽到,執行對應方法。

Spring內已經提供了許多事件,ApplicationEvent可以說是Spring事件的頂級父類。

ApplicationListener 是監聽器的頂級介面,事件被觸發後,onApplicationEvent方法就會執行。

如監聽容器重新整理的一個監聽器:

@Component
public class AppLister implements ApplicationListener<ApplicationEvent> {

	@Override
	public void onApplicationEvent(ApplicationEvent event) {
		// TODO Auto-generated method stub
		if(event instanceof ContextRefreshedEvent) {
			System.out.println("監聽到app啟動");
		}
		
	}

}

自定義事件

自定義事件需要滿足以下條件:
	1、自定義一個事件類,繼承Spring中的事件類。
	2、自定義一個監聽器,實現Spring中的監聽器以及對應方法。
	3、釋出事件

事件類

public class MyEvent extends ApplicationEvent{


	private String msg;

	public MyEvent(Object source, String msg) {
		super(source);
		this.msg = msg;
	}

	public String getMsg() {
		return msg;
	}

	public void setMsg(String msg) {
		this.msg = msg;
	}



}

監聽器

@Component
public class MyLister  implements ApplicationListener<MyEvent>{


	public void onApplicationEvent(MyEvent myEvent) {
		String msg = myEvent.getMsg();
		System.out.println("監聽到訊息: "+msg);
	}
}

測試

@Configuration
@ComponentScan("event")//掃描所有bean
public class EventConfig {
	
}

//釋出者,內部呼叫Spring容器,可以不實現,直接使用容器即可
@Component
public class MyPublisher {
	@Autowired
	ApplicationContext context;

	public void publish(String msg) {
		context.publishEvent(new MyEvent(this, msg));
	}
}


//測試類
public class EventTest {

    ApplicationContext context;

    @Test
    public void test(){
        context=new AnnotationConfigApplicationContext(EventConfig.class);
        MyPublisher publisher = context.getBean(MyPublisher.class);
        publisher.publish("Hello msg");

    }

    @Test
    public void test2(){
        context=new AnnotationConfigApplicationContext(EventConfig.class);
        context.publishEvent(new MyEvent(this,"ok ok"));

    }

}


監聽到訊息: ok ok