2009-07-29 15 views
5

Recentemente ho pubblicato un question su un modo per definire l'implementazione di un servizio astratto sul lato client.JAVA 6 ServiceLoader

dfa citato java.util.ServiceLoader come soluzione per il mio problema.

Ho finito per andare in un modo simile, anche se non usando ServiceLoader direttamente, principalmente perché stavo usando JDK 5. Ma un altro SOer jut andò in panico quando dfa menzionò ServiceLoader.

Mi chiedo quali sono i problemi principali con l'implementazione di ServiceLoader. Sebbene limitato, sembra un buon modo per risolvere questo problema senza esaurire alcune librerie di terze parti come Guice

+2

Questa domanda è un po 'vecchio, ma se qualcuno in futuro trova questo, questa risposta ad un'altra domanda potrebbe far luce sul perché ServiceLoader non è molto buona: http://stackoverflow.com/questions/7039467/java-serviceloader-with-multiple-classloaders/7237152#7237152 – Dogmatixed

risposta

2

ServiceLoader è meno generale di un framework di iniezione a dipendenza completa come Spring o Guice. È progettato per caricare pigramente servizi, che possono essere distribuiti in fase di esecuzione. Pertanto, ServiceLoader è particolarmente utile per i plugin.

Per una risposta completa è necessario chiedere a Tom Hawtin Tackline.

+0

I miei sentimenti esattamente, questo è il motivo per cui ho postato questa domanda. Per capire, se del caso, le ragioni dietro l'antipatia di questa funzionalità –

4

ServiceLoader è stato aggiunto a java.util in JDK6, prima che la tecnologia di base fosse utilizzata nella classe di servizio.

ServiceLoader e framework DI risolvono problemi simili ma non sono tecnologie equivalenti. ServiceLoader carica le implementazioni di una particolare interfaccia trovata nel classpath. Ad esempio, se si dispone di un programma che legge fogli di calcolo Excel e si trova un lettore in grado di leggere file CSV (che implementa la stessa interfaccia), è possibile rilasciare il lettore nel classpath e renderlo disponibile e selezionabile come opzione all'interno del programma. (Ciò significa che il tuo codice è intrinsecamente più flessibile).

Iniezione di dipendenza (almeno in termini di Primavera) richiede una conoscenza apriori delle classi trovate nel suo percorso di classe al fine di iniettarlo. I tuoi file di configurazione di Spring devono essere modificati per sfruttare tutte le implementazioni aggiuntive che aggiungi al classpath. Non può semplicemente selezionarli riavviando il server.

1

Ignorare vari performance complaints and class loader issues il vero problema di architettura con ServiceLoader è che fondamentalmente degenera nello Service locator pattern e tutti i problemi generali che accompagnano il pattern del localizzatore di servizi (inizializzatori statici). Di conseguenza, alcuni ritengono che il pattern del localizzatore di servizi sia malvagio e che sia meglio utilizzare la struttura completa di DI o plugin, in particolare poiché lo standard @Inject è ora standardizzato.

Così alcune alternative sono: