Java szolgáltatói felület

1. Áttekintés

A Java 6 bevezette az adott felülethez illeszkedő megvalósítások felfedezésének és betöltésének funkcióját: Szolgáltatói felület (SPI).

Ebben az oktatóanyagban bemutatjuk a Java SPI összetevőit, és megmutatjuk, hogyan alkalmazhatjuk egy gyakorlati felhasználási esetre.

2. A Java SPI fogalmai és definíciói

A Java SPI négy fő összetevőt határoz meg

2.1. Szolgáltatás

Jól ismert programozási interfészek és osztályok, amelyek hozzáférést biztosítanak bizonyos speciális alkalmazásfunkciókhoz vagy szolgáltatásokhoz.

2.2. Szolgáltatói felület

Felület vagy absztrakt osztály, amely a szolgáltatás proxyként vagy végpontként működik.

Ha a szolgáltatás egy interfész, akkor megegyezik a szolgáltató interfésszel.

A szolgáltatás és az SPI együttesen jól ismert a Java ökoszisztémában API-ként.

2.3. Szolgáltató

Az SPI sajátos megvalósítása. A Szolgáltató egy vagy több konkrét osztályt tartalmaz, amelyek megvalósítják vagy kibővítik a szolgáltatás típusát.

A szolgáltatót egy szolgáltató konfigurációs fájlján keresztül konfigurálják és azonosítják, amelyet az erőforrás könyvtárba teszünk META-INF / szolgáltatások. A fájlnév az SPI teljesen minősített neve, tartalma pedig az SPI implementáció teljes minősítésű neve.

A Szolgáltató kiterjesztések, jar fájl formájában kerül telepítésre, amelyet az alkalmazás classpath, Java kiterjesztés classpath vagy a felhasználó által definiált classpath formátumba helyezünk.

2.4. ServiceLoader

Az SPI középpontjában az ServiceLoader osztály. Ennek az a szerepe, hogy lustán feltárja és betölti a megvalósításokat. A környezeti classpath segítségével keresi meg a szolgáltató megvalósításait és helyezi őket egy belső gyorsítótárba.

3. SPI minták a Java ökoszisztémában

A Java sok SPI-t kínál. Íme néhány példa a szolgáltatói felületről és az általa nyújtott szolgáltatásról:

  • CurrencyNameProvider: helyi pénznemszimbólumokat biztosít a Valuta osztály.
  • LocaleNameProvider: lokalizált neveket biztosít a Területi beállítás osztály.
  • TimeZoneNameProvider: lokalizált időzóna neveket ad a Időzóna osztály.
  • DateFormatProvider: dátum és idő formátumokat biztosít egy adott területi beállításhoz.
  • NumberFormatProvider: monetáris, egész és százalékos értékeket ad meg a NumberFormat osztály.
  • Sofőr: a 4.0 verziótól kezdve a JDBC API támogatja az SPI mintát. Régebbi verziók a Class.forName () módszer az illesztőprogramok betöltésére.
  • Kitartás: Szolgáltató: biztosítja a JPA API megvalósítását.
  • JsonProvider: biztosítja a JSON objektumok feldolgozását.
  • JsonbProvider: biztosítja a JSON-objektumokat.
  • Kiterjesztés: kiterjesztéseket biztosít a CDI-tárolóhoz.
  • ConfigSourceProvider: forrást biztosít a konfigurációs tulajdonságok lekéréséhez.

4. Kirakat: Pénzváltási árfolyam-alkalmazás

Most, hogy megértettük az alapokat, írjuk le azokat a lépéseket, amelyekre szükség van egy árfolyam-alkalmazás felállításához.

E lépések kiemeléséhez legalább három projektet kell használnunk: árfolyam-api, árfolyam-implicit, és árfolyam-kb.

A 4.1. Alszakaszban kitérünk a Szolgáltatás, a SPI és a ServiceLoadermodulon keresztül árfolyam-api, majd a 4.2. mi megvalósítjuk szolgáltatás szolgáltató ban ben az árfolyam-impl modult, végül a modulon keresztül mindent összefogunk a 4.3 alszakaszban árfolyam-kb.

Valójában annyi modult tudunk biztosítani, amennyire szükségünk van a service szolgáltató és elérhetővé tegye őket a modul osztályútvonalán árfolyam-kb.

4.1. Az API fejlesztése

Kezdjük egy Maven projekt létrehozásával árfolyam-api. Jó gyakorlat, hogy a név a kifejezéssel végződik api, de akárhogy is nevezhetjük.

Ezután létrehozunk egy modellosztályt az árfolyamok devizáinak képviseletére:

csomag com.baeldung.rate.api; public class Idézet {private String valuta; privát LocalDate dátum; ...}

És akkor meghatározzuk a sajátunkat Szolgáltatás idézetek lekéréséhez a felület létrehozásával QuoteManager:

csomag com.baeldung.rate.api nyilvános felület QuoteManager {list getQuotes (String baseCurrency, LocalDate date); }

Ezután létrehozunk egy SPI szolgáltatásunkhoz:

com.baeldung.rate.spi csomag; nyilvános felület ExchangeRateProvider {QuoteManager create (); }

És végül létre kell hoznunk egy segédosztályt ExchangeRate.java amelyet az ügyfélkód felhasználhat. Ez az osztály delegálja ServiceLoader.

Először a statikus gyári módszerre hivatkozunk Betöltés() hogy egy példányt kapjon ServiceLoader:

ServiceLoader loader = ServiceLoader .load (ExchangeRateProvider.class); 

És akkor meghívjuk a hajtogat() módszer az összes elérhető megvalósítás keresésére és visszakeresésére.

Iterátor = betöltő.iterátor (); 

A keresési eredmény tárolva van, így meghívhatjuk a ServiceLoader.reload () módszer az újonnan telepített megvalósítások felfedezéséhez:

Iterátor = betöltő.reload (); 

És itt van a hasznossági osztályunk:

public class ExchangeRate {ServiceLoader loader = ServiceLoader .load (ExchangeRateProvider.class); nyilvános Iterator-szolgáltatók (logikai frissítés) {if (frissítés) {loader.reload (); } return loader.iterator (); }}

Most, hogy rendelkezünk egy szolgáltatással az összes telepített megvalósítás megszerzéséhez, az összeset felhasználhatjuk az ügyfélkódban alkalmazásunk kiterjesztésére, vagy csak egyet a kívánt megvalósítás kiválasztásával.

Ne feledje, hogy ennek a segédosztálynak nem kötelező része a api projekt. Az ügyfélkód választhatja a meghívást Maga a ServiceLoader módszerek.

4.2. A Szolgáltató kiépítése

Hozzunk létre most egy Maven projektet árfolyam-impl és hozzáadjuk az API függőséget a pom.xml:

 com.baeldung árfolyam-api 1.0.0-SNAPSHOT 

Ezután létrehozunk egy osztályt, amely megvalósítja az SPI-t:

public class YahooFinanceExchangeRateProvider implementálja az ExchangeRateProvider {@Override public QuoteManager create () {return new YahooQuoteManagerImpl (); }}

És itt a QuoteManager felület:

public class YahooQuoteManagerImpl implementálja a QuoteManager {@Override public List getQuotes (String baseCurrency, LocalDate date) {// lehívás a Yahoo API-ból}}

A felfedezés érdekében létrehozunk egy szolgáltató konfigurációs fájlt:

META-INF / services / com.baeldung.rate.spi.ExchangeRateProvider 

A fájl tartalma az SPI implementáció teljesen minősített osztályneve:

com.baeldung.rate.impl.YahooFinanceExchangeRateProvider 

4.3. Összeállítva

Végül hozzunk létre egy nevű ügyfélprojektet árfolyam-kb és adja hozzá a függőségi átváltási árfolyamot az osztályútvonalhoz:

 com.baeldung árfolyam-api 1.0.0-SNAPSHOT 

Ezen a ponton felhívhatjuk az SPI-t alkalmazásunkból:

ExchangeRate.providers (). ForEach (szolgáltató -> ...);

4.4. Az alkalmazás futtatása

Most összpontosítsunk valamennyi modulunk felépítésére:

mvn tiszta csomag 

Ezután futtatjuk az alkalmazásunkat a Jáva parancsot a szolgáltató figyelembevétele nélkül:

java -cp ./exchange-rate-api/target/exchange-rate-api-1.0.0-SNAPSHOT.jar:./exchange-rate-app/target/exchange-rate-app-1.0.0-SNAPSHOT.jar com.baeldung.rate.app.MainApp

Most bekapcsoljuk a szolgáltatónkat java.ext.dirs kiterjesztés és újra futtatjuk az alkalmazást:

java -Djava.ext.dirs = $ JAVA_HOME / jre / lib / ext: ./ exchange-rate-impl / target: ./ exchange-rate-impl / target / attól függ -cp ./exchange-rate-api/target/ exchange-rate-api-1.0.0-SNAPSHOT.jar: ./ exchange-rate-app / target / exchange-rate-app-1.0.0-SNAPSHOT.jar com.baeldung.rate.app.MainApp 

Láthatjuk, hogy a szolgáltatónk van betöltve.

5. Következtetés

Most, hogy a Java SPI mechanizmusát jól definiált lépéseken keresztül vizsgáltuk, tisztának kell lennie annak megértésében, hogy a Java SPI hogyan használható könnyen bővíthető vagy cserélhető modulok létrehozására.

Noha példánk a Yahoo árfolyamszolgáltatást használta a meglévő külső API-khoz való csatlakozás erejének bemutatására, a termelési rendszereknek nem kell harmadik féltől származó API-kra támaszkodniuk a nagyszerű SPI-alkalmazások létrehozásához.

A kód, mint általában, a Github oldalon található.