SPI및 API의 차이?
어떤 서비스 제공 인터페이스(SPI)및 응용 프로그래밍 인터페이스(API)의 차이점은?
보다 구체적으로, 자바 도서관의, 무엇이 사람들을 API및/또는 SPI게 만드는가?
- classes/interfaces/methods/의 API 설명...너와 사용 목표를 달성한다는-내가 부른다.
- classes/interfaces/methods/의 SPI 설명...그리고 넌 목표를 달성하기 위해 시행한다.
다르게 말하자면, API특정 class/method 당신에게 어떤 일을 하고는 SPI당신은 부합하도록 어떻게 해야 하다고 알려 줍니다.
보통 API, 그리고 SPI분리되어 있다.예를 들어 JDBC에서는 SPI의 드라이버 클래스는 부분이 있습니다. 만약 네가 단순히 Java를 이용하고 싶다면 직접 그것을 사용할, JDBC드라이버를 구현하는 모든 사람들은 클래스를 구현해야 할 필요가 없다.
때때로 그들은 그러나 중복되기도 한다.Connection인터페이스가 둘 다 SPI및 API:당신은 JDBC드라이버를 사용 일상적으로 그것은 JDBC드라이버의 개발자에 의한 실행되어야 할 그것을 사용한다.
효율적인 자바부터, 2판:.
에서 복수의 서비스 제공 업체 서비스를 구현하는 서비스 제공 업체란 틀은 시스템, 시스템은 이 구현은 고객들에게 사용할 수 있는 것은 구현에서 디커플링을 만든다.
한 서비스 공급자 프레임워크의 세가지 필수 요소들:공급자가 구현하는 시스템 구현을 등록하도록 사용하는 서비스 인터페이스,, 공급자 등록 API, 고객이 상품들에 대한 접근을 제공하고 1서비스 API, 고객 서비스의 인스턴스를 가져오는 데 사용하는입니다.그 서비스 액세스를 위한 일반적으로지만 공급 업체 선택에 어떤 기준을 지정할 클라이언트가 필요하지 않아 허용한다.이러한 사양이 없는 경우 API는 기본 구현 인스턴스를 반환합니다.서비스 액세스 API는 서비스 프로바이더 프레임워크의 기반이 되는 "유연한 정적 공장"입니다.
서비스 프로바이더 프레임워크의 네 번째 옵션 컴포넌트는 서비스 프로바이더인터페이스입니다.프로바이더는 이를 구현하여 서비스 구현 인스턴스를 만듭니다.서비스 프로바이더 인터페이스가 없는 경우, 실장은 클래스명으로 등록되고 반영적으로 인스턴스화된다(항목 53).JDBC의 경우 Connection은 서비스 인터페이스의 일부인 DriverManager.registerDriver는 공급자 등록 API, DriverManager.getConnection은 서비스 액세스 API, Driver는 서비스 공급자인터페이스입니다
서비스 프로바이더의 프레임워크 패턴에는 다양한 종류가 있습니다.예를 들어 서비스 액세스 API는 어댑터 패턴을 사용하여 공급자에게 필요한 것보다 풍부한 서비스 인터페이스를 반환할 수 있습니다 [Gamma95, 페이지 139].다음으로 서비스 프로바이더인터페이스와 디폴트프로바이더를 사용한 심플한 실장을 나타냅니다.
// Service provider framework sketch
// Service interface
public interface Service {
... // Service-specific methods go here
}
// Service provider interface
public interface Provider {
Service newService();
}
// Noninstantiable class for service registration and access
public class Services {
private Services() { } // Prevents instantiation (Item 4)
// Maps service names to services
private static final Map<String, Provider> providers =
new ConcurrentHashMap<String, Provider>();
public static final String DEFAULT_PROVIDER_NAME = "<def>";
// Provider registration API
public static void registerDefaultProvider(Provider p) {
registerProvider(DEFAULT_PROVIDER_NAME, p);
}
public static void registerProvider(String name, Provider p){
providers.put(name, p);
}
// Service access API
public static Service newInstance() {
return newInstance(DEFAULT_PROVIDER_NAME);
}
public static Service newInstance(String name) {
Provider p = providers.get(name);
if (p == null)
throw new IllegalArgumentException(
"No provider registered with name: " + name);
return p.newService();
}
}
API는 Application Programming Interface의 약자로, API는 소프트웨어나 플랫폼에서 제공하는 서비스/기능에 액세스하기 위한 수단입니다.
SPI는 Service Provider Interface의 약자로, SPI는 소프트웨어 또는 플랫폼의 동작을 주입, 확장 또는 변경하는 방법입니다.
API는 일반적으로 클라이언트의 서비스 접근을 대상으로 하며 다음과 같은 속성을 가지고 있습니다.
-->API는 특정 동작 또는 출력을 달성하기 위해 서비스에 액세스하는 프로그램 방식입니다.
-->API의 진화적 관점에서 볼 때 클라이언트에게는 추가가 전혀 문제가 되지 않습니다.
-->그러나 API는 클라이언트에 의해 한번 이용되면 적절한 통신이 이루어지지 않는 한 변경/삭제할 수 없습니다.이는 클라이언트의 기대를 완전히 저하시킬 수 있기 때문입니다.
다른 부분의 SPI는 공급자를 대상으로 하며 다음과 같은 속성을 가집니다.
-->SPI는 소프트웨어 또는 플랫폼의 동작을 확장/변경하는 방법입니다(프로그래머블과 프로그램).
-->SPI의 진화는 API의 진화와는 다릅니다.SPI의 삭제는 문제가 되지 않습니다.
-->SPI 인터페이스를 추가하면 문제가 발생하여 기존 구현이 중단될 수 있습니다.
상세한 것에 대하여는, 여기를 클릭해 주세요.서비스 프로바이더 인터페이스
API와 SPI의 차이는 API가 몇 가지 구체적인 구현을 추가로 제공할 때 발생합니다.이 경우 서비스 공급자는 몇 가지 API(SPI)를 구현해야 합니다.
예를 들어 JNDI가 있습니다.
JNDI는 컨텍스트 검색에 인터페이스와 일부 클래스를 제공합니다.콘텍스트를 참조하는 기본 방법은 Intial Context에 나와 있습니다.이 클래스는 내부적으로 공급자 고유의 구현에 SPI 인터페이스(Naming Manager 사용)를 사용합니다.
자세한 내용은 아래의 JNDI 아키텍처를 참조하십시오.
NetBeans' FAQ: SPI란? API와 어떻게 다른가요?
API는 Application Programming Interface의 약자로, 다른 소프트웨어가 통신할 수 있도록 하는 소프트웨어(Java, 보통 Java 클래스)를 의미합니다.
SPI는 Service Provider Interface의 약자입니다.이것은 라이브러리가 애플리케이션(또는 API 라이브러리)에 의해 호출되는 클래스를 제공하고 일반적으로 애플리케이션이 수행할 수 있는 작업을 변경하는 상황에 고유한 API일 수 있는 모든 작업의 하위 집합입니다.
전형적인 예는 Java Mail입니다.API에는 두 가지 측면이 있습니다.
- API 측 - 메일클라이언트를 쓰거나 우편함을 읽으려고 할 때 호출합니다.
- JavaMail이 뉴스나 IMAP 서버 등의 새로운 종류의 서버와 통신할 수 있도록 와이어 프로토콜 핸들러를 제공하는 경우 SPI 측
API 사용자는 SPI 클래스를 보거나 SPI 클래스와 대화할 필요가 거의 없으며 그 반대의 경우도 거의 없습니다.
NetBeans에서 SPI라는 용어는 보통 모듈이 런타임에 주입할 수 있는 클래스를 말합니다.이 클래스는 NetBeans가 새로운 작업을 수행할 수 있도록 합니다.예를 들어 버전 관리 시스템을 구현하기 위한 일반적인 SPI가 있습니다.모듈마다 CVS, 서브버전, 머큐리얼 및 기타 리비전 제어 시스템에 SPI를 구현합니다.그러나 파일을 다루는 코드(API 측)는 버전 관리 시스템이 있는지 또는 무엇인지에 대해 신경 쓸 필요가 없습니다.
크게 강조되지 않은 것처럼 보이지만 API/SPI를 사용하는 이유와 시기를 이해하는 것이 매우 중요합니다.
API/SPI 스플릿은 플랫폼을 실제로 작성할 때에만 필요하며 앞으로 발전할 것으로 예상됩니다.API를 작성하여 향후 하위 호환성을 개선할 필요가 없다는 것을 "알고" 있다면 코드를 두 부분으로 나눌 실질적인 이유는 없습니다.또한 플랫폼을 전혀 작성하지 않는 경우(모든 API 소비자 코드를 제어할 수 있습니다), 유일한 이점은 시간이 필요하더라도 리팩터링할 수 있기 때문에 좋고 깨끗한 오브젝트 디자인입니다.
그러나 플랫폼의 서드파티 클라이언트가 적어도1개 있고 하위 호환 방식으로 변경을 하고 싶다면 API/SPI 스플릿을 사용해야 합니다.
오브젝트 중 .Collection
★★★★★★★★★★★★★★★★★」Collections
.
API: Collections
API 는 API로 정의되는 경우가 많습니다.final
컴파일 시에 클라이언트가 그 오브젝트를 「수정」할 수 없고, 그 정적 메서드에 의존할 수 있습니다.
Collections.emptySet();
모든 클라이언트는 '콜'을 하고 있지만 '실장'을 하고 있지 않기 때문에 JDK 작성자는 새로운 메서드를 자유롭게 추가할 수 있습니다.Collections
오브젝트를 설정합니다.수백만 건의 용도가 있더라도 고객이 파손되지 않도록 할 수 있습니다.
SPI: Collection
누구나 자신의 버전을 구현할 수 있다는 것을 암시하는 인터페이스입니다.따라서 JDK의 작성자는 새로운 메서드를 추가할 수 없습니다.그 때문에, 자신의 메서드를 작성한 모든 클라이언트가 망가지기 때문입니다.Collection
★★★★★★★★★★★★★★★★★★」
으로 추가, 예: "New Interface" (예: "New Interface합니다.Collection2
구현할 메서드를 할 수 있습니다.그런 다음 SPI 클라이언트는 새 버전의 SPI로 마이그레이션하여 추가 방법을 구현할 것인지 또는 이전 방식을 계속 사용할 것인지를 결정할 수 있습니다.
당신은 이미 요점을 이해했을지도 몰라요.두 조각을 하나의 클래스로 결합하면 API가 추가되지 않습니다. API를 공개하지 .abstract class
하위 호환성과 관련하여 향후 진화를 방해할 수 있기 때문입니다.
아직 불명확한 점이 있다면, 위의 내용을 자세히 설명한 이 페이지를 확인해 보시기 바랍니다.
Java 1.8의 한 Java 1.됩니다.default
인터페이스에 정의되어 있는 메서드.
SPI는 API의 특정 기능을 구현하고 서비스 룩업 메커니즘을 통해 사용 가능한 것으로 등록함으로써 더 큰 시스템에 슬롯을 연결할 수 있습니다.API는 최종 사용자 애플리케이션코드에 의해 직접 사용되지만 SPI 컴포넌트를 통합할 수 있습니다.캡슐화와 직접 사용의 차이입니다.
서비스 공급자인터페이스는 모든 공급자가 구현해야 하는 서비스 인터페이스입니다.기존의 프로바이더 실장 중 어느 것도 효과가 없는 경우는, 독자적인 서비스 프로바이더(서비스 인터페이스의 실장)에 기입해, 어딘가에 등록해 둘 필요가 있습니다(Roman 의 유용한 투고 참조).
서비스 인터페이스의 기존 프로바이더 구현을 재사용하는 경우 기본적으로 해당 프로바이더의 API를 사용합니다.이 API에는 서비스 인터페이스의 모든 메서드와 자체 퍼블릭 메서드가 포함됩니다.SPI 외부에서 공급자 API 메서드를 사용하는 경우 공급자별 기능을 사용합니다.
Java 세계에서는 다양한 테크놀로지가 모듈화되어 애플리케이션 서버에 「플러그」되는 것을 의미합니다.그러면 와는 차이가 있다.
- 응용 프로그램서버
- [SPI]
- 플러그형 기술
- [API]
- 최종 사용자 응용 프로그램
이러한 테크놀로지의 2가지 예로는 JTA(트랜잭션 매니저)와 JCA(JMS 또는 데이터베이스용 어댑터)가 있습니다.하지만 다른 사람들도 있어요.
그런 다음 이러한 플러그 가능 기술의 구현자는 SPI를 앱 서버에서 플러그 가능하도록 구현하고 최종 사용자 애플리케이션에서 사용할 API를 제공해야 합니다.JCA의 예로는 SPI의 일부인 Managed Connection 인터페이스와 최종 사용자 API의 일부인 Connection이 있습니다.
언급URL : https://stackoverflow.com/questions/2954372/difference-between-spi-and-api
'sourcecode' 카테고리의 다른 글
vue.js 2에서 슬롯이 렌더링되면 컴포넌트의 높이를 측정합니다. (0) | 2022.08.19 |
---|---|
템플릿 Vue 내에 스크립트 태그를 삽입합니다. (0) | 2022.08.17 |
GDB에서 특정 중단점이 히트했을 때 특정 액션을 수행하려면 어떻게 해야 합니까? (0) | 2022.08.17 |
Vue - 중첩된 속성의 기본값 (0) | 2022.08.17 |
C의 char 문자열을 수정할 수 있습니까? (0) | 2022.08.17 |