在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