Sobre os provedores de serviços

Consulte também

Na versão 1.3, o JDK começou a usar um conceito chamado provedores de serviços. Este conceito introduz um estilo de registro completamente declarativo, que é baseado apenas no classpath atual de uma máquina virtual Java e em nada mais. Isso tem possui uma vantagem importante que contribui extremamente para a facilidade do uso desse estilo de registro: para alterar o conjunto de provedores registrados, basta selecionar um arquivo JAR que ofereça tal provedor e incluí-lo no classpath da aplicação. Seu provedor se tornará acessível imediatamente para todos os códigos que procurarem por ele

A idéia básica é que cada arquivo JAR (na terminologia do NetBeans, cada módulo) que pretenda fornecer uma implementação de alguma interface, por exemplo javax.xml.parsers.DocumentBuilderFactory, possa criar sua própria implementação da interface, digamos org.sakson.MyFactory, e a expõe para o sistema como um serviço, criando um arquivo META-INF/services/javax.xml.parsers.DocumentBuilderFactory dentro do seu próprio arquivo JAR. O arquivo contém um nome da classe da implementação por linha. Neste exemplo, ele conteria uma linha registrando a fábrica sakson: org.sakson.MyFactory.

O método DocumentBuilderFactory.newInstance procura todos os arquivos META-INF/services/javax.xml.parsers.DocumentBuilderFactory usando ClassLoader.getResources("META-INF/services/javax.xml.parsers.DocumentBuilderFactory"), lê seu conteúdo e instanciam a(s) classe(s) encontrada(s) chamando seus construtores padrão. A primeira implementação da DocumentBuilderFactory é retornada a partir do método newInstance.

While you can manually create the registration of a service in your module, usually you will use the org.openide.util.lookup.ServiceProvider annotation, which creates such a registration for you automatically.

Como já foi mencionado, este estilo existe desde o JDK 1.3 e é uma forma padrão de lidar com todos os provedores de serviços. Não somente o NetBeans adotou esse estilo, como também ele ganhou popularidade entre outros desenvolvedores de Java. Como resultado, o JDK 1.6 introduziu a nova classe de utilitário java.util.ServiceLoader.

Consulte também
Sobre o desenvolvimento de módulo e a plataforma NetBeans
Sobre a comunicação entre módulos

Notificações legais