Se ServiceLoader
si adatta in gran parte alle vostre esigenze, questo significa che state cercando l'individuazione dei servizi tramite la presenza di file sul percorso della classe. Questa è solo una piccola parte di ciò che OSGi fornisce.
OSGi consente di installare in modo dinamico bundle, pubblicizzare servizi, revocare pubblicità e disinstallare i pacchetti tutto mentre l'applicazione è in esecuzione. Inoltre, come consumatore di servizi, è possibile consultarli con entusiasmo, filtrando le query preliminari, e rilevare quando i fornitori di servizi offerti vanno e vengono. Questi pacchetti non devono necessariamente trovarsi sul percorso della classe e possono essere forniti in varie forme; I file Jar e "directory esplose" sono i due che ricordo.
Al contrario, ServiceLoader
fa solo una cosa: espone le fabbriche individuabili. Generalmente si crea un'interfaccia di tipo factory che richiede alcuni argomenti per decidere se quel provider può offrire il servizio appropriato, ad esempio mappando un determinato nome di set di caratteri a CharsetDecoder
. Non esiste un protocollo formalizzato per l'acquisizione e il rilascio di un servizio da tale fornitore. OSGi formalizza il legame e lo slegamento dei consumatori ai servizi. Il consumatore può ricevere una notifica quando nuovi fornitori arrivano online e il fornitore può ricevere una notifica quando un consumatore acquisisce e rilascia un'istanza di servizio. Se questo controllo del ciclo di vita è importante per il tuo servizio e perdi OSGi, dovrai costruirlo tu stesso; ServiceLoader
non arriva così lontano.
In alternativa, piuttosto che la ricerca e l'utilizzo di servizi desiderosi, è possibile adottare un approccio passivo e dichiarativo e consentire ad uno dei responsabili delle dipendenze OSGi di soddisfare le esigenze dichiarate con i fornitori di servizi disponibili. Ci sono molti manager delle dipendenze tra cui scegliere. Spring Dynamic Modules è uno dei più capaci.
OSGi offre molti altri servizi "middleware". Non cercherò di venderti su di loro qui, poiché la tua domanda si concentra principalmente su ciò che ti mancherebbe scegliendo ServiceLoader
.
Grazie - è sempre difficile sapere cosa sia OSGi.No, ho davvero bisogno solo di quello che ha ServiceLocator e apprezzo che sia integrato. Ero solo sospettoso, non ne avevo sentito parlare prima che pensassi che fosse malato o qualcosa del genere. –
Uso 'ServiceLoader' su un progetto corrente e le uniche frustrazioni che ho trovato sono 1) con la necessità di spingere le estensioni come file Jar sul percorso della classe (le nostre applicazioni non incoraggiano l'utente finale a manipolare il percorso della classe) e 2) l'ordine non specificato con il quale i fornitori di pari livello della stessa interfaccia di servizio saranno esposti a un consumatore. Quest'ultimo rende difficile incorporare una "priorità", come quella che le estensioni fornite dall'utente dovrebbero essere preferibili ai servizi di base dell'applicazione. Di conseguenza, 'ServiceLoader' viene utilizzato al meglio quando i provider non si sovrappongono o competono tra loro. – seh