Java 一個特殊的類 ServiceLoader 詳解__Java

來源:互聯網
上載者:User

  ServiceLoader與ClassLoader是Java中2個即相互區別又相互聯絡的載入器.JVM利用ClassLoader將類載入記憶體,這是一個類聲明周期的第一步(一個java類的完整的生命週期會經曆載入、串連、初始化、使用、和卸載五個階段,當然也有在載入或者串連之後沒有被初始化就直接被使用的情況)。詳情請參閱:詳解Java類的生命週期

那ServiceLoader又是什麼呢。ServiceLoader:一個簡單的服務提供者載入設施。服務 是一個熟知的介面和類(通常為抽象類別)集合。服務提供者 是服務的特定實現。提供者中的類通常實現介面,並子類化在服務本身中定義的子類。服務提供者可以以擴充的形式安裝在 Java 平台的實現中,也就是將 jar 檔案放入任意常用的擴充目錄中。也可通過將提供者加入應用程式類路徑,或者通過其他某些特定於平台的方式使其可用。……唯一強制要求的是,提供者類必須具有不帶參數的構造方法,以便它們可以在載入中被執行個體化。

通過在資來源目錄META-INF/services中放置提供者設定檔 來識別服務提供者。檔案名稱是服務類型的完全限定二進位名稱。該檔案包含一個具體提供者類的完全限定二進位名稱列表,每行一個。忽略各名稱周圍的空格、定位字元和空行。注釋字元為'#'('\u0023', NUMBER SIGN);忽略每行第一個注釋字元後面的所有字元。檔案必須使用 UTF-8 編碼。 

以延遲方式尋找和執行個體化提供者,也就是說根據需要進行。服務載入器維護到目前為止已經載入的提供者緩衝。每次調用 iterator 方法返回一個迭代器,它首先按照執行個體化順序產生緩衝的所有元素,然後以延遲方式尋找和執行個體化所有剩餘的提供者,依次將每個提供者添加到緩衝。可以通過 reload 方法清除緩衝。

    首先這個類是 final 不能繼承的。經常我們會有一個介面許多實作類別,比如: UserDao介面有UserDaoImpl1 、UserDaoImpl2 ....等多個實現。這時候我們只能自己new,但是有了ServiceLoader<S>就非常方便,他會幫我們把實作類別放入一個集合方便遍曆 。但是這又有什麼用呢,這個配合命令模式就有大用了:

    首先在src檔案夾下面建立一個META-INF檔案夾裡面再建立一個services檔案夾裡面放著一個你介面的全類名 的檔案 比如 org.web.UserDao  

而檔案裡面放著這個介面的實作類別 比如 org.web.UserDaoImpl1  org.web.UserDaoImpl2

然後一句代碼就OK了 

ServiceLoader<UserDao>list=ServiceLoader.load(UserDao.class); 

然後就可以遍曆list了 

接下來介紹一下這個ServiceLoader的常用用途

比如我們要判斷傳過來來的值是什麼類型的

if(a == 1){  //處理的事}else if(a == 2){  //處理的事}else if(a == 2){  //處理的事} 

這樣的話以後多一種情況就多一種else if   不利於擴充

所以可以把每個if 做成命令模式

首先建立一個借口 Interface 

public interface inte{  //判斷是否用這個實作類別的解決方案  public boolean is(int num);  //解決方案  public void result();} 

然後建立2個實作類別

public class inteImpl1 implements inte{  public boolean is(int num){    //代替了多重if    if(num == 1)      return true;    return false;  }  public void result(){    //這裡是 1的解決方案  }} 
public class inteImpl2 implements inte{   public boolean is(int num){    //代替了多重if    if(num == 2)      return true;    return false;  }  public void result(){    //這裡是 2的解決方案  }} 

寫好services裡面的對應介面和實作類別的全類名:

xx.xx.inteImpl1xx.xx.inteImpl2 


然後就可以使用了:

ServiceLoader<Inte> list=ServiceLoader.load(Inte.class);  for(Inte in :list){  if(in.is(1)){    in.result();  }} 

這樣以後要擴充就多寫一個實作類別,多加一項配置,更好的體現了物件導向的思想。


參考:http://blog.csdn.net/lmh12506/article/details/50428860

    http://www.cnblogs.com/nimendezaige/p/4866468.html




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.