Fork me on GitHub

Binding Services

The org.nnsoft.guice.gspi.ServiceLoaderModule provides APIs to bind Services to Provided discovered via SPI pattern.

Given an hipotetycal FooService:

package com.acme;

public interface FooService
{

    void doSomething();

}

With related implementations:

package com.acme.first;

public final class FooServiceImpl1
    implements FooService
{

    @Override
    public void doSomething()
    {
        // ...
    }

}

and

package com.acme.second;

public final class FooServiceImpl2
    implements FooService
{

    @Override
    public void doSomething()
    {
        // ...
    }

}

Then define the SPI in META-INF/services/com.acme.FooService file(s):

# created by Jack Bauer in less than 24h

com.acme.first.FooServiceImpl1
com.acme.second.FooServiceImpl2   # EOL comment

# comments and blank lines supported


#

Then users can:

  • Bind the Service to the first discovered Provider
    import static com.google.inject.Guice.createInjector;
    
    import com.acme.FooService;
    import com.google.inject.Injector;
    
    import org.nnsoft.guice.gspi.ServiceLoaderModule;
    
    ...
    
    Injector injector = createInjector( new ServiceLoaderModule()
    {
    
        @Override
        protected void configure()
        {
            bindService( FooService.class ).loadingFirstService();
        }
    
    } );

    and the require its injection somewhere else:

    public class PowerTool
    {
    
        @Inject
        private FooService fooService;
    
        // setters and algorithms omitted
    
    }
  • Bind the Service to all discovered Provider
    import static com.google.inject.Guice.createInjector;
    
    import com.acme.FooService;
    import com.google.inject.Injector;
    
    import org.nnsoft.guice.gspi.ServiceLoaderModule;
    
    ...
    
    Injector injector = createInjector( new ServiceLoaderModule()
    {
    
        @Override
        protected void configure()
        {
            bindService( FooService.class ).loadingAllService();
        }
    
    } );

    and the require their injection somewhere else:

    public class SuperPowerTool
    {
    
        @Inject
        private Set<FooService> fooService;
    
        // setters and algorithms omitted
    
    }

    Eh?!? Just that?!? YES!!! :)

Loading Services from SystemProperties

Alternatively, SPIs can be specified via Java System properties:

java -Dcom.acme.FooService=com.acme.first.FooServiceImpl1,com.acme.second.FooServiceImpl2

Where , is the separator character between Providers.

Note

If SPIs will be found in Java System properties, META-INF/services/com.acme.FooService file(s) will be ignored