Skip to content

ExtendingGuice

sameb edited this page Jul 7, 2014 · 8 revisions

Guice's SPI for authors of tools, extensions and plugins

The service provider interface exposes Guice's internal models to aid in the development in tools, extensions, and plugins.

Core Abstractions

InjectionPoint A constructor, field or method that can receive injections. Typically this is a member with the @Inject annotation. For non-private, no argument constructors, the member may omit the annotation. Each injection point has a collection of dependencies.
Key A type, plus an optional binding annotation.
Dependency A key, optionally associated to an injection point. These exist for injectable fields, and for the parameters of injectable methods and constructors. Dependencies know whether they accept null values via an @Nullable annotation.
Element A configuration unit, such as a bind or requestInjection statement. Elements are visitable.
Module A collection of configuration elements. Extracting the elements of a module enables static analysis and code-rewriting. You can inspect, rewrite, and validate these elements, and use them to build new modules.
Injector Manages the application's object graph, as specified by modules. SPI access to the injector works like reflection. It can be used to retrieve the application's bindings and dependency graph.

The Elements SPI page has more information about using these classes.

Abstractions for Extension Authors

(New in Guice 3.0)

@Toolable An annotation used on methods also annotated with @Inject. This instructs Guice to inject the method even in Stage.TOOL. Typically used for extensions that need to gather information to implement HasDependencies or validate requirements and fail early for easier testing.
ProviderWithExtensionVisitor An interface that provider instances implement to allow extensions to visit custom subinterfaces of BindingTargetVisitor. See [[Extensions SPI

The Extensions SPI page has more information about writing extensions that expose an SPI

Examples

Log a warning for each static injection in your Modules:

  public void warnOfStaticInjections(Module... modules) { 
    for (Element element : Elements.getElements(modules)) { 
      element.acceptVisitor(new DefaultElementVisitor<Void>() { 
        @Override 
        public Void visit(StaticInjectionRequest element) { 
          logger.warning("Static injection is fragile! Please fix " 
              + element.getType().getName() + " at " + element.getSource()); 
          return null; 
        } 
      }); 
    } 
  } 
Clone this wiki locally