자바 SPI 메커니즘 원리 및 코드 실례

3230 단어 JavaSPI메커니즘
SPI 의 전체 이름 은 Service Provider Interface 입 니 다.대부분의 개발 자 들 은 잘 모 를 수 있 습 니 다.이것 은 제조 업 체 나 플러그 인 을 대상 으로 하 는 것 이기 때 문 입 니 다.java.util.Service Loader 문서 에 비교적 상세 한 소개 가 있 습 니 다.
자바 SPI 메커니즘 의 사상 을 간단하게 정리 하 다.우리 시스템 에서 추상 적 인 각 모듈 은 로그 모듈 의 방안,xml 분석 모듈,jdbc 모듈 의 방안 등 다양한 실현 방안 이 있 습 니 다.대상 을 대상 으로 하 는 디자인 에서 우 리 는 보통 모듈 간 에 인터페이스 프로 그래 밍 을 바탕 으로 모듈 간 에 실현 류 에 대해 하 드 인 코딩 을 하지 않 는 것 을 추천 합 니 다.
코드 에 구체 적 인 실현 류 가 포함 되면 삽입 가능 한 원칙 을 위반 하고 하나의 실현 이 필요 하 다 면 코드 를 수정 해 야 한다.모듈 을 조립 할 때 프로그램 에서 동적 으로 가리 키 지 않 기 위해 서 는 서비스 발견 메커니즘 이 필요 하 다.
자바 SPI 는 이러한 메커니즘 을 제공 합 니 다.특정한 인터페이스 에 서 비 스 를 실현 하 는 메커니즘 을 찾 습 니 다.IOC 와 유사 한 사상 이 있 는데 바로 조립 의 통제 권 을 프로그램 밖으로 옮 기 는 것 이다.모듈 화 디자인 에서 이 메커니즘 은 특히 중요 하 다.
자바 SPI 의 구체 적 인 약속 은 서비스 제공 자가 서비스 인 터 페 이 스 를 제공 한 후에 jar 패키지 의 META-INF/services/디 렉 터 리 에 서비스 인터페이스 이름 을 가 진 파일 을 동시에 만 드 는 것 이다.이 파일 에는 이 서비스 인 터 페 이 스 를 실현 하 는 구체 적 인 실현 클래스 가 있다.
외부 프로그램 이 이 모듈 을 설치 할 때 이 jar 패키지 META-INF/services/의 설정 파일 을 통 해 구체 적 인 구현 클래스 이름 을 찾 고 실례 화 를 불 러 와 모듈 의 주입 을 완성 할 수 있 습 니 다.
이러한 약속 을 바탕 으로 서비스 인터페이스의 실현 류 를 잘 찾 을 수 있 고 코드 에서 만 들 필요 가 없다.jdk 에서 서 비 스 를 제공 하여 찾 을 수 있 는 도구 클래스:java.util.Service Loader.
1.common-logging
apache 가 최초 로 제공 한 로그 의 인터페이스 입 니 다.인터페이스 만 있 고 실현 되 지 않 았 다.구체 적 인 방안 은 각 공급 자 에 의 해 이 루어 집 니 다.로그 공급 자 는 META-INF/services/org.apache.comons.logging.LogFactory 설정 파일 을 스 캔 하여 이 파일 의 내용 을 읽 고 로그 공상 실현 류 를 찾 습 니 다.
로그 구현 에 이 파일 이 포함 되 어 있 고 파일 에 LogFactory 공장 인터페이스의 실현 류 를 만 들 면 됩 니 다.자바 기술 스 택 위 챗 공식 번 호 를 주목 하고 배경 에서 키워드:자바,더 많은 스 택 장 이 정리 한 자바 기술 건 화 를 얻 을 수 있 습 니 다.
2.jdbc
jdbc 4.0 이전에 개발 자 는 Class.forName("xxx")방식 으로 구동 을 불 러 와 야 했 고 jdbc 4 도 spi 의 메커니즘 을 바탕 으로 구동 공급 자 를 발 견 했 습 니 다.META-INF/services/java.sql.driver 파일 에서 구현 클래스 를 지정 하 는 방식 으로 구동 공급 자 를 노출 할 수 있 습 니 다.
콘 텐 츠 관리 시스템 에 검색 모듈 이 있 습 니 다.인터페이스 기반 프로 그래 밍 입 니 다.검색 의 실현 은 파일 시스템 에 기반 한 검색 일 수도 있 고 데이터 베 이 스 를 기반 으로 한 검색 일 수도 있 습 니 다.
인터페이스 정 의 는 다음 과 같 습 니 다.

package my.xyz.spi;
import java.util.List;
public interface Search {
 public List serch(String keyword);
}
A 사 는 파일 시스템 검색 방식 으로 Search 인 터 페 이 스 를,B 사 는 데이터베이스 시스템 방식 으로 Search 인 터 페 이 스 를 구현 했다.
A 회사 가 실현 하 는 클래스:com.A.spi.impl.FileSearch
B 회사 가 실현 하 는 클래스:com.B.spi.impl.database Search
그러면 A 사가 jar 패 키 지 를 발표 할 때 jar 패키지 에 META-INF/services/my.xyz.spi.Search 파일 에 다음 과 같은 내용 을 써 야 합 니 다.
com.A.spi.impl.FileSearch
그러면 B 사가 jar 패 키 지 를 발표 할 때 jar 패키지 에 META-INF/services/my.xyz.spi.Search 파일 에 다음 과 같은 내용 을 써 야 합 니 다.
com.B.spi.impl.DatabaseSearch
다음은 SPI 테스트 코드:

package com.xyz.factory;
import java.util.Iterator;
import java.util.ServiceLoader;
import my.xyz.spi.Search;
public class SearchFactory {
 private SearchFactory() {
 }
 public static Search newSearch() {
  Search search = null;
  ServiceLoader<Search> serviceLoader = ServiceLoader.load(Search.class);
  Iterator<Search> searchs = serviceLoader.iterator();
  if (searchs.hasNext()) {
   search = searchs.next();
  }
  return search;
 }
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기