>  기사  >  Java  >  Java spi 메커니즘에 대한 간략한 소개

Java spi 메커니즘에 대한 간략한 소개

黄舟
黄舟원래의
2017-03-15 11:27:281600검색

최근에 저는 회사의 일부 프레임워크와 이전에 본 일부 오픈 소스 프레임워크가 일부 서비스 검색 및 액세스에 Java의 SPI 메커니즘을 사용하는 것을 확인했습니다.

자바 spi 메커니즘의 아이디어를 간략하게 요약해 보겠습니다.

우리 시스템에는 로그 모듈 솔루션, xml 구문 분석 모듈, jdbc 모듈 솔루션 등과 같이 각 추상 모듈에 대해 다양한 구현 솔루션이 있는 경우가 많습니다. 객체 지향 설계에서는 일반적으로 인터페이스를 기반으로 모듈 간 프로그래밍을 권장하고, 모듈 간 구현 클래스를 하드 코딩하지 않는 것이 좋습니다. 특정 구현 클래스가 코드에 포함되면 이는 플러그 가능성 원칙을 위반하는 것입니다. 구현을 교체해야 하는 경우 코드를 수정해야 합니다.

프로그램에서 동적으로 지정하지 않고도 모듈을 조립할 수 있다는 것을 실현하려면 서비스 검색 메커니즘이 필요합니다. Java SPI는 특정 인터페이스에 대한 서비스 구현을 찾는 메커니즘을 제공합니다. 이는 어셈블리 제어를 프로그램 외부로 옮기려는 ​​​​IOC의 아이디어와 다소 유사합니다. 이 메커니즘은 모듈형 설계에서 특히 중요합니다.

java spi의 구체적인 규약은 다음과 같습니다:

서비스 제공자가 서비스 인터페이스 구현을 제공하는 경우 jar의 META-INF/services package / 디렉토리에도 서비스 인터페이스 이름을 딴 파일이 생성된다. 이 파일에는 서비스 인터페이스를 구현하는 특정 구현 클래스가 포함되어 있습니다. 외부 프로그램이 이 모듈을 어셈블할 때 jar 패키지 META-INF/services/의 구성 파일 을 통해 특정 구현 클래스 이름을 찾고 인스턴스화를 로드하여 모듈 주입을 완료할 수 있습니다.

이러한 규칙을 기반으로 서비스 인터페이스의 구현 클래스를 코드에서 지정하지 않고도 쉽게 찾을 수 있습니다.

jdk는 서비스 구현 조회를 위한 도구 클래스를 제공합니다: java.util.ServiceLoader

1.common-logging

Apache가 제공하는 최초의 로깅 파사드 인터페이스입니다. 인터페이스만 있고 구현은 없습니다. 구체적인 솔루션은 각 공급자가 구현합니다. 로그 공급자는 META-INF/services/org.apache.commons.logging.LogFactory 구성 파일을 스캔하고 읽는 것으로 나타났습니다. 파일에서 산업 및 상업 구현 클래스를 언급하는 로그 내용을 찾습니다. 로그 구현이 이 파일을 포함하고 파일에 LogFactory 팩토리 인터페이스의 구현 클래스를 공식화하는 한. 2.jdbcjdbc4.0 이전에는 개발자도

클래스

를 기반으로 해야 했습니다. 이름("xxx")을 사용하여

드라이버

를 로드합니다. jdbc4는 또한 spi 메커니즘을 기반으로 드라이버 공급자를 검색합니다. 드라이버 파일 드라이버 공급자를 노출하기 위해 구현 클래스를 지정하는 방법이 있습니다. 3. 간단한 예제를 직접 작성해 보세요 디스플레이와 검색이라는 두 가지 모듈로 나누어진 콘텐츠

검색

시스템이 있다고 가정해 보겠습니다. 표시 및 검색은 인터페이스 프로그래밍을 기반으로 합니다. 검색 구현은 파일 시스템 검색 또는 데이터베이스 기반 검색을 기반으로 할 수 있습니다. 예제 코드는 다음과 같습니다

Search.java: 검색 인터페이스

package search;  
  
import java.util.List;  
  
import definition.Doc;  
  
public interface Search {  
    List<Doc> search(String keyword);  
}
File

Search.java: 파일 시스템 검색 구현

package search;  
  
import java.util.List;  
  
import definition.Doc;  
  
public class FileSearch implements Search {  
  
    @Override  
    public List<Doc> search(String keyword) {  
        System.out.println("now use file system search. keyword:" + keyword);  
        return null;  
    }  
  
}

DatabaseSearch.java

package search;  
  
import java.util.List;  
  
import definition.Doc;  
  
public class DatabaseSearch implements Search {  
  
    @Override  
    public List<Doc> search(String keyword) {  
        System.out.println("now use database search. keyword:" + keyword);  
        return null;  
    }  
  
}

SearchTest.java

package search;  
  
import java.util.Iterator;  
import java.util.ServiceLoader;  
  
public class SearchTest {  
  
    public static void main(String[] args) {  
        ServiceLoader<Search> s = ServiceLoader.load(Search.class);  
        Iterator<Search> searchs = s.iterator();  
        if (searchs.hasNext()) {  
            Search curSearch = searchs.next();  
            curSearch.search("test");  
        }  
    }  
}
마지막으로 META-INF/services/search.Search 파일에 생성되었습니다.

search.Search 파일 콘텐츠가 "search.FileSearch"인 경우 프로그램 출력은 다음과 같습니다.

now use file system search. keyword:test
search.Search 파일 콘텐츠가 "search.DatabaseSearch"인 경우 프로그램 출력은 다음과 같습니다. :

now use database search. keyword:test

SearchTest에서 특정 구현과 관련된 코드가 없음을 알 수 있으나, 서비스의 구현을 찾는 spi 메커니즘을 기반으로 합니다

위 내용은 Java spi 메커니즘에 대한 간략한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.