Si ServiceLoader
se ajusta principalmente a sus necesidades, eso significa que está buscando descubrimiento de servicio a través de la presencia de archivos en la ruta de clase. Eso es solo una pequeña parte de lo que OSGi proporciona.
OSGi le permitirá instalar paquetes dinámicamente, anunciar servicios, revocar anuncios y desinstalar paquetes mientras se ejecuta la aplicación. Además, como consumidor de servicios, puede buscarlos ansiosamente (con filtrado de consultas de predicados) y detectar cuándo van y vienen los proveedores de servicios ofrecidos. Estos paquetes no necesitan estar en la ruta de clase, y se pueden proporcionar de varias formas; Jar archivos y "directorios explotados" son los dos que recuerdo. Por ejemplo, ServiceLoader
hace una sola cosa: expone las fábricas detectables. Por lo general, creará una interfaz de fábrica que tome algún argumento para decidir si ese proveedor puede ofrecer el servicio adecuado, como asignar un nombre de conjunto de caracteres dado a CharsetDecoder
. No existe un protocolo formalizado para adquirir y liberar un servicio de dicho proveedor. OSGi formaliza la vinculación y desvinculación de los consumidores a los servicios. El consumidor puede recibir una notificación cuando los nuevos proveedores entran en línea, y el proveedor puede recibir una notificación cuando el consumidor adquiera y libere una instancia de servicio. Si este control del ciclo de vida es importante para su servicio y renuncia a OSGi, tendrá que construirlo usted mismo; ServiceLoader
no llega tan lejos.
De forma alternativa, en lugar de la búsqueda y el uso del servicio, puede adoptar un enfoque más pasivo y declarativo y dejar que uno de los administradores de dependencias OSGi coincida con sus necesidades indicadas con los proveedores de servicios disponibles. Hay muchos administradores de dependencia para elegir. Spring Dynamic Modules es uno de los más capaces.
OSGi proporciona muchas otras instalaciones de "middleware". No intentaré venderte aquí, ya que tu pregunta se centra principalmente en lo que te estarías perdiendo al elegir ServiceLoader
.
Gracias - siempre es difícil saber realmente qué es OSGi.No, realmente solo necesito lo que ServiceLocator tiene, y agradezco que esté integrado. Solo sospeché que no había oído hablar de él antes de pensar que debía estar enfermo o algo así. –
Utilizo 'ServiceLoader' en un proyecto actual, y las únicas frustraciones que he encontrado son 1) con la necesidad de insertar extensiones como archivos Jar en la ruta de clase (nuestras aplicaciones no alientan a los usuarios finales a manipular la ruta de clases) y 2) el orden no especificado por el cual los proveedores hermanos de la misma interfaz de servicio estarán expuestos a un consumidor. Esto último hace que sea difícil incorporar una "prioridad", como que las extensiones proporcionadas por el usuario sean preferibles a los servicios básicos de la aplicación. Por lo tanto, 'ServiceLoader' se usa mejor cuando los proveedores no se superponen ni compiten entre sí. – seh