<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-42  評論-349  文章-4  trackbacks-0

    (殘夢追月原創(chuàng),轉(zhuǎn)載注明)

        如果僅僅使用Spring的內(nèi)定事件,那顯然是遠遠不夠的,幸好,Spring為我們提供了中自定義發(fā)布事件的能力。下面通過例程來展示如何發(fā)布并監(jiān)聽自定義的事件。

    在工程中,我們定義一個Animal類,為受管Bean,它具有一個Speak方法,我們要做的就是監(jiān)視該方法,當用戶調(diào)用該方法時觸發(fā)AnimalSpeakEvent事件。具體操作如下:

    新建名字為IoC_Test3.9的java工程,添加Spring開發(fā)能力后,建立ioc.test包。新建一個事件類AnimalSpeakEvent,它繼承自ApplicationEvent,重載其默認的構(gòu)造方法。再添加一個String成員animalName和它的Geter方法。添加一個構(gòu)造方法,此方法有兩個參數(shù),一個為source,一個為animalName。代碼如下:

     1 package ioc.test;
     2 
     3 import org.springframework.context.ApplicationEvent;
     4 
     5 public class AnimalSpeakEvent extends ApplicationEvent {
     6 
     7     private static final long serialVersionUID = 1L;
     8 
     9     private String animalName;
    10 
    11     public AnimalSpeakEvent(Object source) {
    12         super(source);
    13     }
    14 
    15     public AnimalSpeakEvent(Object source,String animalName) {
    16         super(source);
    17         this.animalName = animalName;
    18     }
    19 
    20     public String getAnimalName() {
    21         return animalName;
    22     }
    23 
    24 }
    25 

    創(chuàng)建好該事件類后,就應(yīng)該把它再合適的時候發(fā)布出去。既然它時一個“動物講話事件”,那么就應(yīng)該再動物“講話”的時候發(fā)布,如何發(fā)布呢?我們知道要發(fā)布一個事件,就必須要調(diào)用ApplicationContextpublishEvent方法。要在Animal類中獲得ApplicationContext的實例,就要實現(xiàn)ApplicationContextAware接口,代碼如下:

     

     1 package ioc.test;
     2 
     3 //import省略
     4 
     5 public class Animal implements ApplicationContextAware {
     6 
     7     private ApplicationContext ac;
     8 
     9     private String name;
    10 
    11     private int age;
    12 
    13     public String speak(){
    14 
    15          ac.publishEvent(new AnimalSpeakEvent(this,this.name));
    16         return " 我的名字是;"+this.name+",我的年齡是:"+this.age;
    17    }
    18 
    19 
    20    public void setApplicationContext(ApplicationContext arg0) throws BeansException {
    21     this.ac = arg0;
    22    }
    23 
    24 //Getet和Seter省略
    25 
    26 }
    27 

    到目前為之,我們已經(jīng)在Animal類中把事件發(fā)布出去了,現(xiàn)在要監(jiān)聽該事件的發(fā)生了,至于監(jiān)聽方法,前面已經(jīng)演示過,直接上代碼:

     

     

     1 ackage ioc.test;
     2 
     3 import org.springframework.context.ApplicationEvent;
     4 import org.springframework.context.ApplicationListener;
     5 
     6 public class AnimalEventListener implements ApplicationListener {
     7 
     8     public void onApplicationEvent(ApplicationEvent event) {
     9         if (event instanceof AnimalSpeakEvent) {
    10             AnimalSpeakEvent a = (AnimalSpeakEvent) event;
    11                 System.out.println("事件監(jiān)聽器" + this.getClass().getSimpleName()+":有一個動物在講話!它的名字是:"+ a.getAnimalName());
    12         }
    13     }
    14 }
    15 

    配置好Bean,為AnimalBean注入值,配置文件如下:

     

     

     

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans  …………>
     3 
     4     <bean id="Listener" class="ioc.test.AnimalEventListener" />
     5 
     6     <bean id="Animal" class="ioc.test.Animal">
     7       <property name="name" value="老虎" />
     8       <property name="age" value="5" />
     9     </bean>
    10 
    11 </beans>
    12 

    現(xiàn)在應(yīng)該來測試一下了,看看我們的自定義的事件是不是會再動物“講話”的時候發(fā)生,測試類TestMain代碼如下: 

     

     

     1 package ioc.test;
     2 
     3 import org.springframework.context.support.AbstractApplicationContext;
     4 import org.springframework.context.support.ClassPathXmlApplicationContext;
     5 
     6 public class TestMain {
     7 
     8     public static void main(String[] args) {
     9 
    10         AbstractApplicationContext ac = new ClassPathXmlApplicationContext(
    11                 "applicationContext.xml");
    12 
    13         //從容器獲取動物實例
    14         Animal animal = (Animal)ac.getBean("Animal");
    15 
    16         //讓動物講話
    17         System.out.println(animal.speak());                
    18     }
    19 }
    20 

    運行該類中的主方法,輸出結(jié)果如下:


    可以看到,再動物“講話“之前,我們的事件監(jiān)聽器監(jiān)聽到“動物講話”,并輸出了講話動物的名字。

     



     


     



    By:殘夢追月
    posted on 2008-07-26 10:18 殘夢追月 閱讀(2961) 評論(2)  編輯  收藏 所屬分類: Spring

    評論:
    # re: Spring中ApplicationContext的事件機制(三 自定義事件) 2008-08-13 10:16 | kuan
    這樣會不會在Animal里嵌入了代碼了?  回復(fù)  更多評論
      
    # re: Spring中ApplicationContext的事件機制(三 自定義事件) 2008-08-13 11:58 | 殘夢追月
    不會的。  回復(fù)  更多評論
      
    主站蜘蛛池模板: 国产偷窥女洗浴在线观看亚洲 | 中文字幕亚洲色图| 好猛好深好爽好硬免费视频| 亚洲第一区精品日韩在线播放| 妇女自拍偷自拍亚洲精品| 日韩免费视频一区| 精品亚洲国产成人av| 哒哒哒免费视频观看在线www | 成年女人免费视频播放体验区| 亚洲AV无码精品蜜桃| 成人超污免费网站在线看| 精品国产日韩亚洲一区在线 | 亚洲国产精品无码久久SM| 黄色片免费在线观看| 久久亚洲熟女cc98cm| 特级做A爰片毛片免费69| 亚洲第一街区偷拍街拍| 日韩一级免费视频| 一级午夜免费视频| 亚洲日本一区二区| 成人性生交大片免费看无遮挡| 亚洲精品无码久久久久APP| 免费a级毛片无码av| a级片在线免费看| 亚洲人成高清在线播放| 国产成人一区二区三区免费视频| 日韩大片在线永久免费观看网站| 亚洲精品卡2卡3卡4卡5卡区| 99视频免费播放| 亚洲国产精品网站在线播放| 久久精品国产亚洲7777| 1000部拍拍拍18勿入免费视频下载 | 久久夜色精品国产噜噜亚洲a| 免费观看国产小粉嫩喷水| 三年片在线观看免费西瓜视频| 亚洲jjzzjjzz在线观看| 国产成人精品久久亚洲| 国产又大又粗又长免费视频| 污污污视频在线免费观看| 亚洲三级在线播放| 久久夜色精品国产亚洲av|