자바 의 SPI 메커니즘 실례 상세 설명

2870 단어 JavaSPI 메커니즘
자바 의 SPI 메커니즘 실례 상세 설명
SPI 의 전체 이름 은 Service Provider Interface 입 니 다.일반 개발 자 들 은 잘 모 를 수도 있 습 니 다.이것 은 제조 업 체 나 플러그 인 을 위 한 것 이기 때 문 입 니 다.java.util.Service Loader 문서 에 비교적 상세 한 소개 가 있 습 니 다.그 사상 을 따 져 보면 사실은'콜 백'과 차이 가 많 지 않다.'Callback'의 사상 은 우리 가 API 를 호출 할 때 우 리 는 스스로 논리 코드 를 써 서 API 에 들 어 갈 수 있 고 API 내부 가 적당 할 때 호출 되 어 어느 정도 의'맞 춤 형'을 실현 할 수 있다 는 것 이다.
    전형 적 인 것 은 Collections.sort(Listlist,Comparatorc)이 방법 은 두 번 째 매개 변 수 는 Comparator 인 터 페 이 스 를 실현 하 는 인 스 턴 스 입 니 다.우 리 는 자신의 정렬 규칙 에 따라 클래스 를 작성 하여 이 인 터 페 이 스 를 실현 하고 이 방법 을 입력 할 수 있 습 니 다.그러면 이 방법 은 우리 의 규칙 에 따라 list 를 정렬 할 것 입 니 다.
    이 사상 을 확장 시 켜 우 리 는 SPI 로 위의 예 를 다시 실현 한다.클 라 이언 트 는 자신의 정렬 규칙 을 하나의 클래스 로 작성 하고 Jar 파일 로 포장 합 니 다.이 Jar 파일 에는 META-INF 디 렉 터 리 가 있어 야 합 니 다.그 아래 에는 services 디 렉 터 리 가 있 고 그 다음 에는 텍스트 파일 이 있 습 니 다.파일 이름 은 인터페이스의 전체 이름 입 니 다.

java.util.Comparator。
--META-INF
 --services
  --java.util.Comparator
파일 내용 은 한 줄 만 있 습 니 다:

com.company1.ComparatorProvider
이 줄 은 Comparator 인터페이스의 클래스 의 전체 이름 입 니 다.코드 는 다음 과 같 습 니 다.

package com.company1;
import java.util.Comparator;
import com.mycompany.myapp.MyItem;
public class ComparatorProvider implements Comparator<MyItem>{
  @Override
  public int compare(MyItem o1, MyItem o2) {
        //  name   
    return o1.getName().compareTo(o2.getName());
  }
}
압축 을 컴 파일 한 후 메 인 프로그램의 class path 에 넣 으 십시오.다음은 주 프로그램 입 니 다.

  // class path   Jar META-INF     ,         。
  private static ServiceLoader<Comparator> serviceLoader
  = ServiceLoader.load(Comparator.class);
  
  public static void main(String[] args)
  {
    List<MyItem> myList = new ArrayList<MyItem>();
    myList.add(new MyItem(2,"c","hhh"));
    myList.add(new MyItem(3,"k","ooo"));
    myList.add(new MyItem(4,"d","ppp"));
    myList.add(new MyItem(5,"b","ggg"));
    
    showList(myList);
    
    Collections.sort(myList,getCompartor());
    
    showList(myList);  
  }
  
  @SuppressWarnings("unchecked")
  private static Comparator<MyItem> getCompartor() {
    
    for(Comparator service : serviceLoader)
    {
      return (Comparator<MyItem>)service;
    }
        
    return null;
  }
주의해 야 할 것 은 serviceLoader 는 처음에는 로 딩 클래스 일 뿐 이 며,실례 화 는 처음 사용 할 때 까지 입 니 다.마 이 아 이 템 과 방법 쇼 리스트 는 중요 하지 않 으 니 신경 쓰 지 마 세 요.이 규칙 에 따라 다른 정렬 규칙 의 Jar 를 쓸 수 있 습 니 다.언제든지 정렬 규칙 을 바 꿀 수 있 습 니 다.
읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기