Spring---ApplicationContext的事件機制


事件源:ApplicationContext。publishEvent()方法:用於主動觸發容器事件。

事件:ApplicationEvent類,容器事件,必須由ApplicationContext發布。

事件監聽器:ApplicationListener接口,可由容器中任何監聽器Bean擔任。onApplicationEvent(ApplicationEvent event):每當容器內發生任何事件時,此方法都被觸發

容器事件類需繼承ApplicationEvent類,容器事件的監聽器類需實現ApplicationListener接口。

下面給出一個例子

1.首先定義一個EmailEvent類,繼承ApplicationEvent類

public class EmailEvent extends ApplicationEvent {
    private String address;
    private String text;

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

    public EmailEvent(Object source, String address, String text) {
        super(source);
        this.address = address;
        this.text = text;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }
}

2,定義一個EmailNotifier類,實現ApplicationListener接口,並復寫onApplicationEvent()方法

public class EmailNotifier implements ApplicationListener {
    @Override
    public void onApplicationEvent(ApplicationEvent applicationEvent) {
        if (applicationEvent instanceof EmailEvent){
            EmailEvent emailEvent = (EmailEvent) applicationEvent;
            System.out.println("需要發送郵件的接收地址: " + emailEvent.getAddress());
            System.out.println("需要發送郵件的郵件正文: " + emailEvent.getText());
        }else {
            System.out.println("容器本身的事件: " + applicationEvent);
        }
    }
}

3.將監聽器配置在容器中

<bean class="org.spring.listener.EmailNotifier"/>

4.編寫主程序main

public class SpringTest {
    public static void main(String[] args){
        ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-config.xml");
//        EmailEvent ele = new EmailEvent("hello","spring_test@163.com","this is a test");
//        ctx.publishEvent(ele);
    }
}

程序到此結束,運行結果如下:

容器本身的事件: org.springframework.context.event.ContextRefreshedEvent[source=org.springframework.context.support.ClassPathXmlApplicationContext@b81eda8: startup date [Thu Dec 04 20:20:52 CST 2014]; root of context hierarchy]

若取消main中的注釋,即,使用publishEvent()來觸發事件,運行結果如下:

容器本身的事件: org.springframework.context.event.ContextRefreshedEvent[source=org.springframework.context.support.ClassPathXmlApplicationContext@b81eda8: startup date [Thu Dec 04 20:24:03 CST 2014]; root of context hierarchy]
需要發送郵件的接收地址: spring_test@163.com
需要發送郵件的郵件正文: this is a test


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM