Palvelut: provides/uses
Irrota riippuvuudet service loaderilla.
Palvelut: provides/uses on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Java Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Java Academy-kurssilla on yhteensä 4 oppituntia.
Irtikytkentä palveluiden avulla
Moduulit voivat tehdä yhteistyötä ilman riippuvuutta toistensa toteutuksista käyttämällä palvelulataajamallia.
Moduuli ilmoittaa käyttävänsä palvelurajapintaa uses-direktiivillä, ja toinen moduuli ilmoittaa tarjoavansa toteutuksen provides-direktiivillä. JVM yhdistää ne toisiinsa.
Kolme roolia
Palvelulla on kolme osapuolta:
- Palvelurajapinta: sopimus, joka sijaitsee jossakin moduulissa
- Tarjoaja: moduuli, joka toimittaa toteutuksen
- Käyttäjä: moduuli, joka lataa toteutukset suoritusaikana
Palvelurajapinta
Määritelkää ensin sopimus. Se on tavallinen rajapinta viedyssä paketissa, jotta sekä tarjoajat että käyttäjät voivat viitata siihen.
package com.example.spi;
public interface Codec {
String name();
byte[] encode(String input);
}Käyttäjä ilmoittaa uses-direktiivin
Käyttäjämoduuli ilmoittaa käyttävänsä rajapintaa uses-direktiivillä. Tämä kertoo JPMS:lle, että moduuli etsii toteutuksia ServiceLoader-mekanismin avulla.
module com.example.app {
requires com.example.spi;
uses com.example.spi.Codec;
}Tarjoaja ilmoittaa provides-direktiivin
Tarjoajamoduuli ilmoittaa toteuttamansa rajapinnan muodossa provides ... with ... ja nimeää konkreettisen luokkansa.
module com.example.base64 {
requires com.example.spi;
provides com.example.spi.Codec
with com.example.base64.Base64Codec;
}Tarjoajan toteutus
Toteutusluokka on tavallista Javaa. Sen on oltava julkinen, ja sillä on oltava joko julkinen parametriton konstruktori tai julkinen staattinen provider()-metodi.
package com.example.base64;
import com.example.spi.Codec;
import java.util.Base64;
public class Base64Codec implements Codec {
public String name() { return "base64"; }
public byte[] encode(String input) {
return Base64.getEncoder().encode(input.getBytes());
}
}Lataaminen ServiceLoaderilla
Suoritusaikana käyttäjä pyytää ServiceLoader.load(Codec.class)-kutsulla kaikki saatavilla olevat tarjoajat ja käy ne läpi ilman käännösaikaista sidosta mihinkään toteutukseen.
import com.example.spi.Codec;
import java.util.ServiceLoader;
public class App {
public static void main(String[] args) {
ServiceLoader<Codec> loader = ServiceLoader.load(Codec.class);
for (Codec codec : loader) {
System.out.println("Found codec: " + codec.name());
}
}
}Miksi tämä on tehokasta
Käyttäjä ei koskaan nimeä tarjoajaluokkaa. Kun moduulipolulle lisätään uusi tarjoajamoduuli, se löydetään automaattisesti.
Tämä mahdollistaa liitännäisarkkitehtuurit ja riippuvuuksien selkeän kääntämisen päinvastaiseen suuntaan.
provider()-tehdas
Jos olion luominen edellyttää logiikkaa, julkaiskaa parametrittoman konstruktorin sijaan julkinen staattinen provider()-metodi. JPMS kutsuu sitä saadakseen olion.
package com.example.base64;
import com.example.spi.Codec;
public class CodecFactory {
public static Codec provider() {
return new Base64Codec();
}
}Useita tarjoajia
Monet moduulit voivat kukin tarjota saman rajapinnan. ServiceLoader palauttaa ne kaikki, joten käyttäjämoduuli voi valita niistä nimen, prioriteetin tai ominaisuuksien perusteella.
Tarjoajia voi lisätä tai poistaa muuttamatta käyttäjämoduulin koodia.
Tarjoajien käsittely virtana
Java 9:stä lähtien ServiceLoader tarjoaa stream()-metodin, joka palauttaa Provider-kahvoja. Niitä voi suodattaa ennen olioiden luomista, mikä on hyödyllistä, kun luominen on kallista.
import com.example.spi.Codec;
import java.util.ServiceLoader;
public class App {
public static void main(String[] args) {
Codec chosen = ServiceLoader.load(Codec.class).stream()
.map(ServiceLoader.Provider::get)
.filter(c -> c.name().equals("base64"))
.findFirst()
.orElseThrow();
System.out.println("Using: " + chosen.name());
}
}Pikatarkistus
Palauttakaa mieleenne, mitä direktiiviä kukin rooli käyttää.
Kertaus
Opitte moduulien palvelumallin:
- Kolme roolia: palvelurajapinta, tarjoaja ja käyttäjä
- Käyttäjä:
uses; tarjoaja:provides ... with - Toteutukset ladataan suoritusaikana
ServiceLoader-mekanismin avulla - Tarjoajalla on oltava julkinen parametriton konstruktori tai staattinen
provider()-metodi
Seuraavaksi siirretään olemassa oleva projekti moduuleiksi.
Opi Java tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 104
- Oppitunnit
- 374
Usein kysytyt kysymykset
Onko oppitunti ”Palvelut: provides/uses” ilmainen?
Kyllä – oppitunnin ”Palvelut: provides/uses” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Java Academy-kurssin, päivitä CoddyKit PROhon. Java Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Palvelut: provides/uses”?
Irrota riippuvuudet service loaderilla. Harjoittelet Java Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Java Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Java Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.
Kuinka kauan ”Palvelut: provides/uses”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Java Academy-oppitunnilla?
Kyllä. Jokainen Java Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- module-info.java
- requires ja exports
- Palvelut: provides/uses
- Moduuleihin siirtyminen