服務發現 —— ServiceLoader

在java開發中,有一些這樣的場景:
           
項目中加入了某些jar包,編譯時也沒有錯,但運行時就報錯了,
找不到類——這其實就涉及到java中面向接口編程。
            大家都知道面向接口開發有很多好處,特別是在java中要實現回調這樣的功能,
        你還必須使用接口。面向接口開發中涉及兩個要部分:接口(定義)和接口的實現,
         在有些情況下,接口的定義與實現並不在同一個項目中,或者接口定義方跟實現方式分屬不同組織,
         這時候我們要使用這一類接口所擁有的功能時,就需要加入兩部分依賴:接口定義部分jar包及
         該接口的實現jar包,這就是開始提出問題的答案。
         
 其實java開發中這樣的場景比較多:JDBC、JPA、JMS、WebSocket等都是接口定義方與實現方分離,
 不屬於同一個組織,java方一般都是規範的定義者。

 開發中經常遇到這樣的事,但是你有沒有問過自己:定義接口的jar包與實現jar包加入項目後,
 java在運行時是如何將二者關聯起來的,他怎麼知道誰是誰的實現呢?
     
    有人可能說這還不簡單,直接將所有項目jar包掃描一遍不就知道了!?  
    沒錯,這辦法行得通,但是想想都覺得麻煩,效率不高,其實java研發者在1.6的時候就加入了
    一個實現這種需求的類——ServiceLoader,這就是服務發現功能。
    
    服務發現功能約定:
    
       1、服務實現方必須在自己提供的jar包中的META-INF目錄下放置一個目錄,
           名字就叫services
            
       2、在services目錄下放置服務接口類與實現類的關係文件,該文件要求:
            a、文件的名字是被實現的接口的全路徑名(如:a.b.c.IHeHe),文件沒有後綴,
               每個文件代表一個接口。
            b、文件內容是該文件名字所代表的接口的實現類的全路徑名
                 (如:x.y.x.HaHa ,HaHa實現了IHeHe接口),
               如果該接口有多個實現類,則每個實現類佔一行。
   
     這裏給一個小的demo,借用一下網友的例子:
     http://blog.csdn.net/is_zhoufeng/article/details/50722440




          

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章