2009-07-29 18 views
5

Recientemente publiqué un question sobre una forma de definir la implementación de un servicio abstracto en el lado del cliente.JAVA 6 ServiceLoader

dfa mencioné java.util.ServiceLoader como una solución para mi problema.

Terminé yendo de una manera similar, aunque no usé ServiceLoader directamente, principalmente porque estaba usando JDK 5. Pero otro jut de SOer entró en pánico cuando dfa mencionó ServiceLoader.

Me pregunto cuáles son los principales problemas con la implementación de ServiceLoader. Aunque limitado, parece una buena manera de resolver este problema sin completar una biblioteca de terceros como Guice

+2

Esta pregunta es un poco viejo, pero si alguien en el futuro se encuentra presente, esta respuesta a otra pregunta puede arrojar alguna luz sobre por qué ServiceLoader no es muy buena: http://stackoverflow.com/questions/7039467/java-serviceloader-with-multiple-classloaders/7237152#7237152 – Dogmatixed

Respuesta

2

ServiceLoader es menos general que un marco de inyección de dependencia completa como Spring o Guice. Está diseñado para cargar servicios de forma perezosa, que pueden implementarse en tiempo de ejecución. Por lo tanto, ServiceLoader es especialmente útil para los complementos.

Para obtener una respuesta completa, debe preguntar al Tom Hawtin Tackline.

+0

Mis sentimientos exactamente, esta es la razón por la que publiqué esta pregunta. Para comprender, en su caso, las razones detrás de la antipatía de esta característica –

4

ServiceLoader se agregó a java.util en JDK6, antes de eso, la tecnología básica se utilizaba en la clase de servicio.

Los frameworks ServiceLoader y DI resuelven problemas similares, pero no son tecnologías equivalentes. ServiceLoader carga implementaciones de una interfaz particular que se encuentra en el classpath. Por ejemplo, si tiene un programa que lee hojas de cálculo de Excel y encuentra un lector capaz de leer archivos CSV (que implementa la misma interfaz), puede colocar el lector en el classpath y hacer que esté disponible y se pueda seleccionar como una opción dentro de su programa. (Esto significa que su código es intrínsecamente más flexible).

Dependency Injection (al menos en términos de Spring) requiere un conocimiento previo de las clases encontradas en su classpath para poder inyectarlo. Los archivos de configuración de Spring deben modificarse para aprovechar cualquier implementación adicional que agregue a classpath. No puede simplemente elegirlos reiniciando el servidor.

1

Haciendo caso omiso de varios performance complaints and class loader issues el problema real con la arquitectura ServiceLoader es que, básicamente, degenera en la Service locator pattern y todos los problemas generales que vienen con el patrón de reparación (inicializadores estáticos). En consecuencia, hay algunos que creen que el patrón del localizador de servicios es malo y es mejor utilizar el marco completo de DI o complementos, especialmente desde que @Inject está ahora estandarizado.

Por lo tanto algunas de las alternativas son: